ActiveMQ的学习(二)(ActiveMQ的持久化)

消息持久化

消息持久化是保证消息不丢失的重要方式。

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有的文章里没有写,未测试过)

1 <!--class也可以写成org.apache.commons.dbcp.BasicDataSource-->
2 <bean id="mysql-ds" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
3     <property name="driverClassName" value="com.mysql.jdbc.Driver" />
4     <property name="url" value="jdbc:mysql://127.0.0.1:3306/activemq?relaxAutoCommit=true" />
5     <property name="username" value="activemq" />
6     <property name="password" value="activemq" />
7     <property name="maxActive" value="200" />
8     <property name="poolPreparedStatements" value="true" />
9 </bean>

要注意位置如下:手动创建一个名字为activemq的数据库(或者使用已有的数据库)

2. 配置持久化策略

注意:createTablesOnStartup="true"表示在第一次启动时自动建立表结构,再次启动时,应该改为false。

1 <!-- 这里要注意dataSource的名称要跟上面bean的id配置的名称一样 -->
2 <persistenceAdapter>    
3     <jdbcPersistenceAdapter dataSource="mysql-ds" createTablesOnStartup="true" /> 
4 </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

 

持续更新!!!!

 

posted @ 2020-02-15 13:56  夏夜凉凉  阅读(307)  评论(0编辑  收藏  举报