ActiveMQ--消息存储和持久化
- 官网(这里的持久化和前面说的消息持久化是不同的,前面的消息持久化,事务签收都是说的MQ服务器本机,而这里的持久化说的是与本机相连的数据库的数据持久化,包括:kahadb,JDBC等)
- 为了保证高可用,消息不仅在本机MQ存储(持久化)一份,还要再数据库中持久化一份来保证高可用。
- http://activemq.apache.org/persistence
-
- 是什么
- 面试题
- 回忆redis持久化机制有几种
- 说明:一句话:MQ服务器down机了,消息不会丢失的机制
-
- 有那些
- AMQ Message store(了解)
- KahaDB 消息存储(默认)
- 基于日志的文件,从ActiveMQ5.4开始默认的持久化插件
- 官网
- 验证当前持久化使用的默认的存储机制
-
- 说明:http://activemq.apache.org/kahadb
-
- KahaDB的存储原理 (微型数据,有索引有数据,有备份,有锁机制)(kahaDB目录文件下包括:四个文件一把锁)
-
- JDBC消息存储
- LevelDDB消息存储(了解)基于文件存储的数据库
-
- JDBC Messae store with ActiveMQ Joural
- jdbc消息存储
-
MQ+MySQL
-
-
添加mysql数据库的驱动包到lib文件夹
-
-
jdbcPersistenceAdapter配置
-
-
<persistenceAdapter>
<jdbcPersistenceAdapter dataSource= "#mysql-ds"/>
</persistenceAdapter>
-
-
-
数据库连接池配置
-
<bean id="mysql-ds" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://172.29.64.226:3306/activemq?relaxAutoCommit=true"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
<property name="maxTotal" value="200"/>
<property name="poolPreparedStatements" value="true"/>
</bean>
-
建仓sQL和建表说明
- 新建一个名为activemq的数据库
- 三张表说明
- ACTIVEMQ_MSGS
-
- ACTIVEMQ_ACKS
- ACTIVEMQ_LOCK
-
- ACTIVEMQ_MSGS
- 如果建立数据库ok+上述配置ok+代码运行ok,三表自会自动形成
- 万一情况,手动建表sql(如果配置好无需手动,应急使用手动)
-
代码运行验证
- 一定要持久化(默认为持久化的消息)
- messageProducer . setDeliveryMode (DeliveryMode. PERSISTENT);
- 非持久化的消息不会存储到jdbc数据库中的表中
- 队列和topic都的消息都记录在activemq_msgs表中
- 启动队列中的消息被消费后会从表中删除,而topic的消息不会被删除会一直在表存储
- 队列:
- topic:
- 消费者先运行
-
-
在运行发布者发布消息(发布者发布的消息会保存到表中,就算被订阅者接受消费也不会删除)
-
- 消费者先运行
- 一定要持久化(默认为持久化的消息)
-
数据库情况
- 一单运行产生code
- 点到点的
- 发布订阅的类型
- mysql
- 在运行消费者看看表activemq_msgs 数据变换情况
- 先启消费的订阅者在运行生产,看看表activemq_acks
- 一单运行产生code
-
小总结
- 队列中的消息保存到activemq_msgs表中
- topic中的消息保存到activemq_msgs ,topic的订阅者都保存到activemq_scks
-
开发有坑
-
-
- JDBC Message store with ActiveMQ Journal
- 是什么:(高速缓存配置)说明,在数据库和MQ中间当一层高速缓存 :journal 日志
- 配置
- 重启配置文件激活
- 运行
- 生产者生产了消息,在mq中可以找到,但是在数据库中不会及时出现,但是消费者也是也以消费到的,这既是因为jorunal的存在
- 生产者生产的消息会先和journal 高速缓存打交道,不会直接存到数据库中了。
- 但是不影响消费者,消费者消费的消息也会从journal中获取。
-
- 是什么:(高速缓存配置)说明,在数据库和MQ中间当一层高速缓存 :journal 日志
-
持久化机制小总结
-
消息生产之后,会先存储到journal中,这是如果有消费者将将消息消费了会从journal中删除,就不会将这些数据存到数据库中了,减小了数据库的压力,
-
若一直没有消费者消费等几分钟后journal中的消息才会存储到数据库中
-
-