首先将连接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