首先將連接mysql所需的jar包放到ActiveMQ安裝目錄下的lib
文件夾中
第二步,創建數據庫,用於接下來ActiveMQ連接使用。
接下來修改配置文件,配置文件爲安裝目錄下conf
目錄下的activemq.xml
在修改之前,最好將文件備份一次,以免改錯
找到persistenceAdapter
標籤,將原有默認的kahaDB
註釋掉,添加支持JDBC的標籤
<!--
<persistenceAdapter>
<kahaDB directory="${activemq.data}/kahadb"/>
</persistenceAdapter>
-->
<persistenceAdapter>
<jdbcPersistenceAdapter dataSource="#mysql-ds"/>
</persistenceAdapter>
現在添加數據庫的配置,在這個文件夾中,添加一個bean
。注意這裏bean
的id
,就是上面jdbcPersistenceAdapter
標籤中dataSource
引用的id
<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/activemq?relaxAutoCommit=true"/>
<property name="username" value="activemq"/>
<property name="password" value="activemq"/>
<property name="poolPreparedStatements" value="true"/>
</bean>
放bean
的位置也有講究,一定要放在broker
標籤的外面
做到這一步,ActiveMQ與MySql整合已經完成,如果配置沒問題,在啓動ActiveMQ的時候,它會在數據庫中自動創建三張表分,別是ACTIVEMQ_ACKS
、 ACTIVEMQ_LOCK
和 ACTIVEMQ_MSGS
。
三張表介紹
ACTIVEMQ_MSGS:
消息表,Queue和Topic都存在裏面。隊列的消息在消費後會刪除,而持久化訂閱則會一直保存在裏面。
下面是自動生成表後,這張表的建表語句,不用手動生成。
CREATE TABLE `ACTIVEMQ_MSGS` (
`ID` bigint(20) NOT NULL,
`CONTAINER` varchar(250) NOT 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_MIDX` (`MSGID_PROD`,`MSGID_SEQ`),
KEY `ACTIVEMQ_MSGS_CIDX` (`CONTAINER`),
KEY `ACTIVEMQ_MSGS_EIDX` (`EXPIRATION`),
KEY `ACTIVEMQ_MSGS_PIDX` (`PRIORITY`),
KEY `ACTIVEMQ_MSGS_XIDX` (`XID`)
) ENGINE=InnoDB DEFAULT CHARSET=ascii;
ACTIVEMQ_ACKS:
用於儲存訂閱關係,如果是持久化Topic,服務器訂閱和訂閱者關係會存在這個表。
下面是自動生成表後,這張表的建表語句,不用手動生成。
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=ascii;
ACTIVEMQ_LOCK:
這個表在集羣環境中才有用,用於記錄當前MasterBroker的。
下面是自動生成表後,這張表的建表語句,不用手動生成。
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=ascii;
MySql配合使用高性能的journal
在上幾步,已經完成了ActiveMQ使用MySql實現持久化,但是官網上是這樣說的:對於長期的持久性,我們建議使用JDBC和高性能journal。如果你願意,你可以只使用JDBC,但是它很慢。
單單使用MySql,雖然實現了持久化,但是不能避免的是ActiveMQ與MySql通信時的網絡延遲以及數據庫讀寫所產生的耗時,所以ActiveMQ有了一個高性能的journal日誌配合使用。它會在消費者快速消費的時候在journal中讀取數據,在消費者消費比較慢的時候,會默默的將未消費的數據同步到數據庫當中。
如何實現?
將上一步驟的持久化配置修改如下
<!--
<persistenceAdapter>
<jdbcPersistenceAdapter dataSource="#mysql-ds"/>
</persistenceAdapter>
-->
<persistenceFactory>
<journalPersistenceAdapterFactory
journalLogFiles="5"
dataSource="#mysql-ds"
dataDirectory="activemq-data" />
</persistenceFactory>
重啓過後,隨意發一些消息,就會發現消息在不消費的情況下,等一段時間,數據庫中才會有數據,並且在隊列消費過後,數據庫的消息也會一段時間後才刪除。
而且在journal目錄下會產生一些文件,這些文件就是一些持久化文件。文件在ActiveMQ安裝目錄的/bin/activemq-data/journal
中
[root@localhost journal]# pwd
/usr/local/activemq/bin/activemq-data/journal
[root@localhost journal]# ll
總用量 84
-rw-r--r--. 1 root root 160 12月 2 11:16 control.dat
-rw-r--r--. 1 root root 20971520 12月 2 11:44 log-000.dat
-rw-r--r--. 1 root root 20971520 12月 2 11:13 log-001.dat
-rw-r--r--. 1 root root 20971520 12月 2 11:13 log-002.dat
-rw-r--r--. 1 root root 20971520 12月 2 11:13 log-003.dat
-rw-r--r--. 1 root root 20971520 12月 2 11:13 log-004.dat