ActiveMQ-持久化存储方式
Posted daishengda
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ActiveMQ-持久化存储方式相关的知识,希望对你有一定的参考价值。
1、ActiveMQ消息持久化方式
- 文件
- MySQL数据库
- oracle数据
- LevelDB方式
2、如何修改持久化存储方式
- 文件持久化
ActiveMQ默认的消息保存方式,一般如果没有修改过其他持久化方式的话可以不用修改配置文件。
可在confactivemq.xml配置,找到<persistenceAdapter>节点,修改即可
1 <persistenceAdapter> 2 <kahaDB directory="${activemq.data}/data/kahadb"/> 3 </persistenceAdapter>
然后修改配置文件(此处演示为spring+ActiveMQ),找到消息发送者所对应的JmsTemplate配置代码块,增加以下配置(默认下是2,也就是持久化)
1 <!-- 是否持久化 DeliveryMode.NON_PERSISTENT=1:非持久 ; DeliveryMode.PERSISTENT=2:持久 --> 2 <property name="deliveryMode" value="2" />
- MySQL持久化
(1) 首先需要把MySQL的驱动和数据源相关包,放到ActiveMQ的lib目录下,这里我用mysql-connector-java-5.1.45.jar、commons-dbcp-1.2.2.jar、commons-pool-1.2.jar
(2) 先手动创建个数据库activemq,打开activemq/conf/activemq.xml,找到<persistenceAdapter>节点,将其替换成
配置一个mysql数据源,persistenceAdapter节点的dataSource名称一致(需要在<broker节点外配置>)
这样就算完成了mysql持久化配置了,验证方式同a,打开mysql数据库你能看到三张表,分别是:activemq_acks,activemq_lock,activemq_msgs。
补充:dataSource指定持久化数据库的bean,createTablesOnStartup是否在启动的时候创建数据表,默认值是true,这样每次启动都会去创建数据表了,一般是第一次启动的时候设置为true,之后改成false。
数据库表信息:
activemq_msgs表:
用于存储消息,Queue和Topic都存储在这个表中:
ID:自增的数据库主键
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。
- 类似MySQL的思路也能配置出Oracle
- LevelDB方式
从ActiveMQ 5.6版本之后,又推出了LevelDB的持久化引擎。
目前默认的持久化方式仍然是KahaDB,不过LevelDB持久化性能高于KahaDB,可能是以后的趋势。
在ActiveMQ 5.9版本提供了基于LevelDB和Zookeeper的数据复制方式,用于Master-slave方式的首选数据复制方案
以上是关于ActiveMQ-持久化存储方式的主要内容,如果未能解决你的问题,请参考以下文章