ActiveMQ消息存储方式

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>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值