ActiveMQ消息持久化

Posted steakliu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ActiveMQ消息持久化相关的知识,希望对你有一定的参考价值。

  和前面我们说的持久,事物,签收不同的,前面的都是局限在同一台机器上,如果本机器坏了,那全部的消息也都丢失了

和Redis的持久化其实是一个概念,当我的主机宕机了也能将消息持久到硬盘或者其他上面(物理备份),方便恢复

官网详情:http://activemq.apache.org/persistence

ActiveMQ的消息持久化机制:

  JDBC,AMQ,KahaDB,LevelDB,几种的存储逻辑都是一致的,将消息发出后,消息中心首先将消息存储到本地数据文件,内存数据库或者远程数据库,再试图将消息发送给接收者,成功则将消息从存储中删除,失败则继续尝试发送

  消息中心启动后首先要检查指定的存储位置,若发现没有成功发送的消息,则需要把消息发送出去

 

  AMQ:AMQ是一种以文件形式存储的机制,现在淘汰了,是5.3以前的

  KahaDB:以日志形式记录消息,5.4以后默认就是KahaDB

技术图片

 

 

     配置文件activemq.xml里默认KahaDB

    官网详情:http://activemq.apache.org/persistence.html

技术图片

 

 

     kahaDB存储在data目录

技术图片

 

  kahadb目录:

 

 技术图片

 

 

   KahaDB消息存储使用一个事物日志(db.log)和一个索引文件(db.data)来存储它的所有地址,日志相当于书的文章,索引相当于目录

  db-<number>.log用来存储消息,当此文件存储满了,又会产生一个新的文件,如第一个是db-1.log,当存储满了,又会产生一个db-2.log,类推,当不再有引用到数据库文件中的任何消息时,文件会被删除或者归档

  db.data包含了持久化的BTree索引,索引了消息数据记录中的消息,它是消息的索引文件,本质时B树

  db.rebo:用来进行消息恢复,如果KahaDB消息存储在强制退出后启动,用于恢复B树索引

  lock:文件锁,就像mysql中的悲观锁,表示获得当前KahaDB读写操作的broker

 

  LevelDB:基于文件的存储,没有使用B树作为索引(了解),5.8后才出现

 <persistenceAdapter>
      <levelDB directory="activemq-data"/>
 </persistenceAdapter>

 

  JDBC消息存储:同步消息到mysql

    步骤:1.添加mysql驱动包到/activemq/lib下

       2.jdbcPersistenceAdapter配置,将其取代KahaDB

<persistenceAdapter> 
  <jdbcPersistenceAdapter dataSource="#my-ds"/> 
</persistenceAdapter>

技术图片

 

 

 

       3.数据库连接池配置

 <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://自己数据库/activemq?relaxAutoCommit=true"/> 
    <property name="username" value="用户名"/> 
    <property name="password" value="密码"/> 
    <property name="poolPreparedStatements" value="true"/> 
  </bean> 

注:上面使用的时dbcp2连接池,所以不用引入其他jar包,因为时默认的,如果c3p0,或在druid等连接池,需要引入除了mysql驱动以外的jar包到lib下

技术图片

 

 

 

    4.建数据库和表

      数据库名这里为activemq,如果配置没错,数据库连通的话,运行代码就会产生3张表,

        ACTIVEMQ_MEGS

        ACTIVEMQ_ACKS

        ACTIVEMQ_LOCK

技术图片

 

     自动生成表是因为createTablesOnStartup设置为true,默认为true,

 

    5.代码验证

      当DeliveryMode设置为NON_PERSISTANCE时,消息被保存到内存中

      设置为PERSISTANCE,消息保存到相应的文件或者数据库中

      

      在队列模式中,消息一旦被消费后就从相应的文件或者数据库删除

 

    在springboot工程中我投放了五条消息

技术图片

 

技术图片

 

 

   此时消息还没有被消费掉,所以持久化到了数据库

技术图片

 

   然后启动消费者消费消息

技术图片

 

   此时消息被消费后,就从数据库中删除,为空

技术图片

 

以上是关于ActiveMQ消息持久化的主要内容,如果未能解决你的问题,请参考以下文章

ActiveMQ---ActiveMQ原理分析之消息持久化

ActiveMQ的学习(ActiveMQ的持久化)

学习ActiveMQ:activemq的持久化

activemq部分消息无法取走

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

ActiveMQ 消息存储