ActiveMQ_持久化,MySql以及高性能的journal日誌

首先將連接mysql所需的jar包放到ActiveMQ安裝目錄下的lib文件夾中

image

第二步,創建數據庫,用於接下來ActiveMQ連接使用。

接下來修改配置文件,配置文件爲安裝目錄下conf目錄下的activemq.xml

在修改之前,最好將文件備份一次,以免改錯

image

找到persistenceAdapter標籤,將原有默認的kahaDB註釋掉,添加支持JDBC的標籤

 <!--
<persistenceAdapter>
    <kahaDB directory="${activemq.data}/kahadb"/>
</persistenceAdapter>
-->
<persistenceAdapter> 
	<jdbcPersistenceAdapter dataSource="#mysql-ds"/> 
</persistenceAdapter>

現在添加數據庫的配置,在這個文件夾中,添加一個bean注意這裏beanid,就是上面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標籤的外面

image


做到這一步,ActiveMQ與MySql整合已經完成,如果配置沒問題,在啓動ActiveMQ的時候,它會在數據庫中自動創建三張表分,別是ACTIVEMQ_ACKSACTIVEMQ_LOCKACTIVEMQ_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中讀取數據,在消費者消費比較慢的時候,會默默的將未消費的數據同步到數據庫當中。

image

如何實現?

將上一步驟的持久化配置修改如下

<!--
<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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章