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

本文详细介绍如何将ActiveMQ与MySQL进行整合,实现消息持久化。步骤包括放置JAR包、创建数据库、修改配置文件、配置JDBC数据源以及启用高性能journal。文中还解释了自动生成的三张表的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先将连接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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值