一、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>