基于文件的存储机制,是以前的默认机制,现在不再使用。AMQ是一种文件存储形式,它具有写入速度快和容易恢复的特点。消息存储在一个个文件中,文件的默认大小为32M,当一个文件中的消息已经全部被消费,那么这个文件将被标识为可删除,在下一个清除阶段这个文件会被删除。AMQ适用于ActiveMQ5.3之前的版本。
KahaDB
基于日志文件,从ActiveMQ5.4(含)开始默认的持久化,下面我们详细介绍。
LevelDB消息存储
新兴的技术,现在有些不确定。 官方文档:。这种文件系统是从ActiveMQ5.8之后引进的,它和KahaDB非常相似,也是基于文件的本地数据库存储形式,但是它提供比KahaDB更快的持久性。但它不使用自定义B-Tree实现来索引独写日志,而是使用基于LevelDB的索引,默认配置如下:
<persistenceAdapter> <levelDB directory="activemq-data"/> </persistenceAdapter>JDBC消息存储
下面我们再详细介绍
JDBC Message Store with ActiveMQ Journal
下面我们再详细介绍
8.4 KahaDB消息存储理解
KahaDB是目前默认的存储方式,可用于任何场景,提高了性能和恢复能力。消息存储使用一个 事务日志 和仅仅用一个 索引文件 来存储它所有的地址。KahaDB是一个专门针对消息持久化的解决方案,它对典型的消息使用模型进行了优化。数据被追加到data logs中。当不再需要log文件中的数据的时候,log文件会被丢弃。
官网文档:,官网上还有一些其他配置参数。
activemq.xml配置文件
<persistenceAdapter> <kahaDB directory="${activemq.data}/kahadb"/> </persistenceAdapter>KahaDB存储原理
KahaDB在消息保存的目录中有4类文件和一个lock,跟ActiveMQ的其他几种文件存储引擎相比,这就非常简洁了。
db-number.log KahaDB存储消息到预定大小的数据纪录文件中,文件名为db-number.log。当数据文件已满时,一个新的文件会随之创建,number数值也会随之递增,它随着消息数量的增多,如每32M一个文件,文件名按照数字进行编号,如db-1.log,db-2.log······。当不再有引用到数据文件中的任何消息时,文件会被删除或者归档。
db.data 该文件包含了持久化的BTree索引,索引了消息数据记录中的消息,它是消息的索引文件,本质上是B-Tree(B树),使用B-Tree作为索引指向db-number。log里面存储消息。
db.free 记录当前db.data文件里面哪些页面是空闲的,文件具体内容是所有空闲页的ID
db.redo 用来进行消息恢复,如果KahaDB消息存储再强制退出后启动,用于恢复BTree索引。
lock 文件锁,表示当前kahadb独写权限的broker。
8.4 JDBC消息存储原理图
配置
添加mysql数据库的驱动包到ActiveMQ的lib文件夹下
在activemq.xml配置文件指定JDBC消息存储
<!-- <persistenceAdapter> <kahaDB directory="${activemq.data}/kahadb"/> </persistenceAdapter> --> <persistenceAdapter> <!-- dataSource指定将要引用的持久化数据库的bean名称 createTablesOnStartup指定是否在启动的时候创建数据表,默认为true 注意:一般是第一次启动时设置为true,之后改为false --> <jdbcPersistenceAdapter dataSource="#mysql-ds" createTablesOnStartup="true"/> </persistenceAdapter>在activemq.xml配置文件的标签和标签之间插入数据库连接池配置
注意:
① 我们需要准备一个mysql数据库,并创建一个名为activemq的数据库
② 默认是的dbcp数据库连接池,如果要换成其他数据库连接池,需要将该连接池jar包,也放到lib目录下。
... </broker> <bean destroy-method="close"> <property value="com.mysql.jdbc.Driver"/> <property value="jdbc:mysql://mpolaris.top:3306/activemq?relaxAutoCommit=true"/> <property value="root"/> <property value="123456"/> <property value="200" /> <property value="true"/> </bean> <import resource="jetty.xml"/> ...