Java高知 2020-02-15
消息持久化
消息持久化是保证消息不丢失的重要方式。
ActiveMQ提供了以下三种的消息存储方式:
1. Memory消息存储-基于内存的消息存储。
2. 基于日志消息存储方式,KahaDB是ActiveMQ的默认日志存储方式,它提供了容量的提升和恢复能力。
3. 基于JDBC的消息存储方式-数据存储于数据库中(如:mysql)
(此外还有LevelDB存储,AMQ方式--只适用于5.3版本以前)
ActiveMQ持久化机制流程图:
基于内存的存储
注意:基于内存的存储在重启ActiveMQ的时候消息会丢失,具体的效果在yml文件中配置如下图所示即可
基于日志消息存储(kahadb)
KahaDB是默认的持久化策略,所有消息顺序添加到一个日志文件中,同时另外有一个索引文件记录指向这些日志的存储地址,还有一个事务日志用于消息回复操作。是一个专门针对消息持久化的解决方案,它对典型的消息使用模式进行了优化。
在data/kahadb这个目录下,会生成四个文件,来完成消息持久化。
1.db.data 它是消息的索引文件,本质上是B-Tree(B树),使用B-Tree作为索引指向db-*.log里面存储的消息。
2.db.redo 用来进行消息恢复 。
3. db-*.log 存储消息内容。新的数据以APPEND的方式追加到日志文件末尾。属于顺序写入,因此消息存储是比较 快的。默认是32M,达到阀值会自动递增。
4.lock文件 锁,写入当前获得kahadb读写权限的broker ,用于在集群环境下的竞争处理。
注意:如果采用这种策略,那么日志文件都会保存的如下目录中:
yml配置文件配置如下:
基于JDBC的消息存储方式
使用JDBC持久化方式,数据库默认会创建3个表,每个表的作用如下:
activemq_msgs:queue和topic的消息都存在这个表中。
activemq_acks:存储持久订阅的信息和最后一个持久订阅接收的消息ID。
activemq_lock:跟kahadb的lock文件类似,确保数据库在某一时刻只有一个broker在访问。
注意:首先yml配置
之后在activemq.xml中插入如下内容
1. 配置数据库连接池(这里3306和relaxAutoCommit=true有的文章里没有写,未测试过)
<!--class也可以写成org.apache.commons.dbcp.BasicDataSource--> <bean id="mysql-ds" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://127.0.0.1:3306/activemq?relaxAutoCommit=true" /> <property name="username" value="activemq" /> <property name="password" value="activemq" /> <property name="maxActive" value="200" /> <property name="poolPreparedStatements" value="true" /> </bean>
要注意位置如下:手动创建一个名字为activemq的数据库(或者使用已有的数据库)
2. 配置持久化策略
注意:createTablesOnStartup="true"表示在第一次启动时自动建立表结构,再次启动时,应该改为false。
<!-- 这里要注意dataSource的名称要跟上面bean的id配置的名称一样 --> <persistenceAdapter> <jdbcPersistenceAdapter dataSource="mysql-ds" createTablesOnStartup="true" /> </persistenceAdapter>
要注意位置如下:
之后复制对应的jar包到activemq解压目录下的lib下
这里要注意:(jar包版本无限制)
如果你上面采用的是com.alibaba.druid.pool.DruidDataSource的方式:那么需要复制druid-1.1.6.jar和mysql-connector-java-5.1.46.jar
如果你上面采用的是org.apache.commons.dbcp.BasicDataSource的方式:那么需要复制commons-dbcp-1.4和mysql-connector-java-8.0.9和commons-pool-1.6
最后重启ActiveMQ即可
参考:
https://blog.csdn.net/qq_20597727/article/details/81320298
持续更新!!!!