ActiveMQ安裝與持久化消息


 

activityMQ官網:http://activemq.apache.org/

 有windows版與linux版

 windows版啟動

在bin目錄下雙擊activemq.bat

 

linux版的安裝與啟動

 

安裝:

1.首先下載

參考http://www.cnblogs.com/shihaiming/p/6008319.html

主要步驟是:

  wget http://apache.fayea.com/activemq/5.14.1/apache-activemq-5.14.1-bin.tar.gz
tar -xf ./apache-activemq-5.14.1-bin.tar.gz
cd ./apache-activemq-5.14.1-bin/bin
./activemq start

測試啟動成功與否

ActiveMQ默認監聽61616端口,查此端口看看是否成功啟動

netstat -an|grep 61616

 

ps -ef |grep activemq

 

 

啟動成功后訪問

http://127.0.0.1:8161/admin/

登錄的用戶名與密碼默認都是admin

 

持久化消息

 

A:持久化為文件

     這個你裝ActiveMQ時默認就是這種,只要你設置消息為持久化就可以了。涉及到的配置和代碼有

<persistenceAdapter>
<kahaDB directory="${activemq.data}/kahadb"/>
</persistenceAdapter>

 

B:持久化為MySql

     你首先需要把MySql的驅動放到ActiveMQ的Lib目錄下,我用的文件名字是:mysql-connector-java-5.1.40.jar

     接下來你修改配置文件

<persistenceAdapter> 
<jdbcPersistenceAdapter dataDirectory="${activemq.data}/mysqldb" dataSource="#mysql-ds"/> 
</persistenceAdapter>

 

在網上還看到還有這種配置,我沒嘗試

<persistenceAdapter>  
   <jdbcPersistenceAdapter dataDirectory="${activemq.data}/mysqldb" dataSource="#mysql-ds" createTablesOnStartup="false" />
</persistenceAdapter>

dataSource指定持久化數據庫的bean,createTablesOnStartup是否在啟動的時候創建數據表,默認值是true,這樣每次啟動都會去創建數據表了,一般是第一次啟動的時候設置為true,之后改成false

 

 

在配置文件中的broker節點外增加

<bean id="mysql-ds" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/activemq?relaxAutoCommit=true"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
<property name="maxTotal" value="200"/>
<property name="poolPreparedStatements" value="true"/>
</bean>

 

修改后的效果如下:

 

從配置中可以看出數據庫的名稱是activemq,你需要手動在MySql中增加這個庫。

然后重新啟動消息隊列,你會發現多了3張表

1:activemq_acks

2:activemq_lock

3:activemq_msgs

 

自動建表時activemq_msgs這張表很可能會報錯,看到別人寫的是要改編碼為latin1,但是如果編碼不能改的情況下那就手動建這張表吧。建表語句如下:

 

CREATE TABLE ACTIVEMQ_ACKS(
CONTAINER VARCHAR(250) NOT NULL, 
SUB_DEST VARCHAR(250), 
CLIENT_ID VARCHAR(250) NOT NULL, 
SUB_NAME VARCHAR(250) NOT NULL, 
SELECTOR VARCHAR(250), 
LAST_ACKED_ID BIGINT, 
PRIMARY KEY ( CONTAINER, CLIENT_ID, SUB_NAME)
)ENGINE=INNODB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;

 注意:

    執行建表語句時可能會報下面的錯誤:

    Specified key was too long; max key length is 767 bytes

這是因為Mysql的字段設置的太長了,所以在檢表語句后面加入:ENGINE=INNODB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;

如何還是報錯那就只能把字段的長度改短了。在mysql5.6報錯,5.7不報錯。

 

 

持久化到mysql后:

如果是queue,在沒有消費者消費的情況下會將消息保存到activemq_msgs表中,只要有任意一個消費者已經消費過了,消費之后這些消息將會立即被刪除。

如果是topic,此時如果還未曾有訂閱者曾今訂閱過此topic。這個時候就不會有任何記錄持久化到表中,因為持久化一個沒有訂閱者的消息是浪費。

 

附上activityMQ的全部建表語句

DROP TABLE IF EXISTS `activemq_acks`;

CREATE TABLE `activemq_acks` (
  `CONTAINER` varchar(250) NOT NULL,
  `SUB_DEST` varchar(250) DEFAULT NULL,
  `CLIENT_ID` varchar(250) NOT NULL,
  `SUB_NAME` varchar(250) NOT NULL,
  `SELECTOR` varchar(250) DEFAULT NULL,
  `LAST_ACKED_ID` bigint(20) DEFAULT NULL,
  `PRIORITY` bigint(20) NOT NULL DEFAULT '5',
  `XID` varchar(250) DEFAULT NULL,
  PRIMARY KEY (`CONTAINER`,`CLIENT_ID`,`SUB_NAME`,`PRIORITY`),
  KEY `ACTIVEMQ_ACKS_XIDX` (`XID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;


DROP TABLE IF EXISTS `activemq_lock`;

CREATE TABLE `activemq_lock` (
  `ID` bigint(20) NOT NULL,
  `TIME` bigint(20) DEFAULT NULL,
  `BROKER_NAME` varchar(250) DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

DROP TABLE IF EXISTS `activemq_msgs`;

CREATE TABLE `activemq_msgs` (
  `ID` bigint(20) NOT NULL,
  `CONTAINER` varchar(250) DEFAULT NULL,
  `MSGID_PROD` varchar(250) DEFAULT NULL,
  `MSGID_SEQ` bigint(20) DEFAULT NULL,
  `EXPIRATION` bigint(20) DEFAULT NULL,
  `MSG` longblob,
  `PRIORITY` bigint(20) DEFAULT NULL,
  `XID` varchar(250) DEFAULT NULL,
  PRIMARY KEY (`ID`),
  KEY `ACTIVEMQ_MSGS_EIDX` (`EXPIRATION`),
  KEY `ACTIVEMQ_MSGS_PIDX` (`PRIORITY`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM