ActiveMQ持久化方式

本文详细介绍了ActiveMQ的三种存储方式:kahadb、JDBC和AMQ,对比了它们的特点、配置方法及适用场景。kahadb作为默认存储,采用日志形式存储消息,支持JMS事务,适合容忍一定消息丢失的场景。JDBC方式将数据存入数据库,如MySQL,适用于不允许消息丢失的场景。AMQ方式虽性能高,但因索引重建时间长和空间占用大,已不再推荐使用。

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

一、kahadb方式

1.1、简介

1)默认存储方式
2)kahadb是一个文件型数据库,使用内存+文件进行数据持久化;
3)可以对单个数据文件的大小控制;
4)如果消息可以容忍丢失,或使用集群/主备模式保证数据安全的时候,建议Kahadb;

<persistenceAdapter> 
	<!-- directory:保存数据的目录; journalMaxFileLength:设置保存消息的文件大小 --> 
	<kahaDB directory="${activemq.data}/kahadb" journalMaxFileLength="16mb"/> 
</persistenceAdapter>

1.2、特点

1)日志形式存储消息;
2)消息索引以 B-Tree 结构存储,可以快速更新;
3)完全支持 JMS 事务;
4)支持多种恢复机制;

二、JDBC方式

2.1、简介

1)将数据持久化到数据库中(如mysql、oracle等),这里使用mysql方式;
2)如果消息不可以容忍丢失,建议使用jdbc方式;

2.2、配置

持久化改为jdbc方式

<persistenceAdapter> 
	<jdbcPersistenceAdapter dataSource="#mysql" createTablesOnStartup="true"/>
</persistenceAdapter>

broker标签外新增一个bean配置

<bean id="mysql" 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>

备注
1、添加数据库驱动jar包到lib目录下(如 mysql-connector-java-5.1.47.jar);
2、第一次启动createTablesOnStartup设置为true自动建表,后续启动设置为false
3、需要先创建对应数据库activemq

2.3、启动服务与建表

重启服务后,自动生成3张表
在这里插入图片描述
ACTIVEMQ_MSGS
用于存储消息,Queue 和 Topic 都存储在这个表中;
CONTAINER:消息的 Destination
MSGID_PROD:消息发送者客户端的主键
MSG_SEQ:是发送消息的顺序,MSGID_PROD+MSG_SEQ 可以组成 JMS 的 MessageID
EXPIRATION:消息的过期时间,存储的是从 1970-01-01 到现在的毫秒数
MSG:消息本体的 Java 序列化对象的二进制数据
PRIORITY:优先级,从 0-9,数值越大优先级越高
ACTIVEMQ_ACKS
用于存储订阅关系,如果是持久化 Topic,订阅者和服务器的订阅关系在 这个表保存;
CONTAINER:消息的 Destination
SUB_DEST:如果是使用 Static 集群,这个字段会有集群其他系统的信息
CLIENT_ID:每个订阅者都必须有一个唯一的客户端 ID 用以区分
SUB_NAME:订阅者名称
SELECTOR:选择器,可以选择只消费满足条件的消息。条件可以用自定义属性实现,可 支持多属性 AND 和 OR 操作
LAST_ACKED_ID:记录消费过的消息的 ID
ACTIVEMQ_LOCK
在集群环境中才有用,只有一个 Broker 可以获得消息,称为 Master Broker;
其他的只能作为备份等待 Master Broker 不可用,才可能成为下一个 Master Broker。 这个表用于记录哪个 Broker 是当前的 Master Broker;

异常
如果抛出找不到dbcp异常,需确认activemq/lib/optional/目录下dbcp版本是否为v2版本,如果是则将org.apache.commons.dbcp.BasicDataSource改为org.apache.commons.dbcp2.BasicDataSource,并且将<property name="maxActive" value="200"/>改为<property name="maxTotal" value="200"/>

Caused by: java.lang.ClassNotFoundException: org.apache.commons.dbcp.BasicDataSource

2.4、效果测试

由生产者生成一条消息,会保存到ACTIVEMQ_MSGS表中,当被消费后则会删除该记录;
在这里插入图片描述

三、AMQ方式

3.1、简介

1)只适用于 5.3 版本之前;
2)也是一个文件型数据库;
3)性能略高于 Kaha DB 方式,,但重建索引时间过长,且索引文件占用磁盘空间过大;
4)性能高于JDBC,将消息写入日志文件时顺序追加写,性能很高;
5)目前不推荐使用;

<persistenceAdapter> 
	<!-- directory:保存数据的目录 ; maxFileLength:保存消息的文件大小 --> 
	<amqPersistenceAdapter directory="${activemq.data}/amq" maxFileLength="32mb"/> 
</persistenceAdapter>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值