AMQ方式
基于文件的方式存储,只适用于5.3之前的版本,了解即可
KahaDB存储
kahaDB是5.4之后版本的默认存储方式,以日志形式存储数据,默认存储在kahadb这个目录下,可以通过conf/activemq.xml文件中的<kahaDB directory="${activemq.data}/kahadb"/>来修改存储路径。在这个目录下会生成4个文件:db-.log,db.data,db.redo,lock
db-.log
存储消息内容,默认大小是32M,达到阈值随着数据的增多会变大,数据是顺序写入进去的
db.data
存储了db-.log的索引数据,是B树
db.redo
用于出现故障时消息恢复
lock
锁,获得锁的broker才有权限对kahadb的读写权,用于集群环境下的锁竞争
JDBC存储
这种方式是将数据持久化到数据库中,数据库会自动创建3个表,如下:
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,数值越大优先级越高 |
xid | 用于存储订阅关系。如果是持久化topic,订阅者和服务器的订阅关系在这个表保存 |
activemq_acks:订阅消息表,存储持久订阅的信息和最后一个持久订阅接收的消息ID
列名 | 字段描述 |
container | 消息的destination |
sub_dest | 如果是使用static集群,这个字段会有集群其他系统的信息 |
client_id | 每个订阅者都必须有一个唯一的客户端id用以区分 |
sub_name | 订阅者名称 |
selector | 选择器,可以选择只消费满足条件的消息。条件可以用自定义属性实现,可支持多属性and和or操作 |
last_acked_id | 记录消费过的消息的id。 |
activemq_lock:在集群环境下才有用,确保只有一个Broker可以访问,称为Master Broker
列名 | 字段描述 |
id | 自增的主键 |
time | 时间 |
broker_name | 当前Master Broker |
配置方式
在activemq.xml中添加
<bean id="mysql-cfg" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<!-- 如果数据库版本是6.0以上则用com.mysql.cj.jdbc.Driver-->
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/activemq?relaxAutoCommit=true"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
<property name="maxActive" value="200"/>
<property name="poolPreparedStatements" value="true"/>
</bean>
修改persistenceAdapter
<persistenceAdapter>
<!--<kahaDB directory="${activemq.data}/kahadb"/>-->
<jdbcPersistenceAdapter dataSource="#mysql-cfg" createTablesOnStartup="true" />
</persistenceAdapter>
createTablesOnStartup设置为true是为了在启动的时候创建数据表,默认是true,一般是首次启动设为true,之后改为false
准备以下jar包放到安装文件的lib目录下
commons-pool-1.6.jar commons-dbcp-1.4.jar mysql-connector-java-8.0.27.jar
LevelDB存储
类似于KahaDB,基于文件的本地数据库形式存储,性能高于KahaDB。但官方不再支持或推荐使用。
配置方式
<persistenceAdapter>
<!--<kahaDB directory="${activemq.data}/kahadb"/> -->
<levelDB directory="${activemq.data}/leveldb"/>
</persistenceAdapter>
Memory存储
基于内存存储,不持久化
配置方式
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" persistent="false" dataDirectory="${activemq.data}">
</broker>
persistent=”false” 表示不持久化
JDBC Message store with ActiveMQ Journal
是基于JDBC的优化,JDBC存储每次操作消息都需要对数据库进行I/O。ActiveMQ Journal使用延迟存储到数据库,当有消息时,先缓存到文件中,消费者消费消息直接从缓存中拿,如果在写入数据前消息被消费了,就不写入到数据库,只将未消费的消息批量写入到数据库。
配置方式
注释掉persistenceAdapter,添加以下配置
<persistenceFactory>
<journalPersistenceAdapterFactory dataSource="#mysql-cfg" dataDirectory="activemqData" />
</persistenceFactory>