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>
View Code

   然后修改配置文件(此处演示为spring+ActiveMQ),找到消息发送者所对应的JmsTemplate配置代码块,增加以下配置(默认下是2,也就是持久化)

技术分享图片
1 <!--  是否持久化  DeliveryMode.NON_PERSISTENT=1:非持久 ; DeliveryMode.PERSISTENT=2:持久 -->   
2 <property name="deliveryMode" value="2" />
View Code
  • 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-持久化存储方式的主要内容,如果未能解决你的问题,请参考以下文章

ActiveMQ-持久化存储方式

ActiveMQ 消息存储持久化

ActiveMQ消息存储持久化

ActiveMQ(09):ActiveMQ消息存储持久化

ActiveMQ 消息存储

ActiveMQ中持久化协议 高可用集群