ActiveMQ学习笔记(8)----ActiveMQ的消息存储持久化
1. 概述
ActiveMQ不仅支持persistent和non-persistent两种方式,还支持消息的恢复(recovery)方式。
2. PTP
Queue的存储是很简单的,其实就是FIFO的Queue

2. PUB/SUB
对于持久化订阅主题,每一个消费者都将获得一个消息的复制。

3. 有效的消息存储
ActiveMQ 提供了一个插件式的消息存储,类似于消息的多点传播,主要实现了如下几种:
1. AMQ消息存储-基于文件的存储方式,是以前默认的消息存储。
2. KahaDB消息存储-提供了容量的提升和恢复能力,是现在的默认存储方式。
3. JDBC 消息存储-消息基于JDBC存储的
4. Memory 消息存储-基于内存的消息存储
4. KahaDB Message Store概述
KahaDB是目前默认的存储方式,可用于任何场景,提高了性能和恢复能力。消息存储使用一个事务日志和仅仅用一个索引文件来存储它所有的地址。
KahaDB是一个专门针对消息持久化的解决方案,它对典型的消息使用模式进行了优化。在KahaDB中,数据被追加到data logs中,当不再需要log文件中的数据的时候,log文件会被丢弃。
5. KahaDB的基本配置例子
<persistenceAdapter>
<kahaDB directory="${activemq.data}/kahadb"/>
</persistenceAdapter>
可用的属性有:
1. directory:KahaDB存放的路径,默认值是activemq-data
2. indexWriteBatchSize: 批量写入磁盘索引page数量,默认值1000
3. indexCacheSize: 内存中缓存索引page的数量,默认值10000
4. enableIndexWriteAsync: 是否支持异步索引,默认false
5. journalMaxFileLength: 设置每个消息data log的大小,默认是23MB
6. enableJournalDiskSyncs: 设置是否保证每个没有事务的内容,被同步写入磁盘,JMS持久化的时候需要,默认为true
7. cleanupInterval: 在检查到不再使用的消息后,在具体删除消息前的时间,默认30000
8. checkpointInterval: checkpoint的间隔时间,默认5000
9. ignoreMissingJournalfiles: 是否忽略丢失的消息日志文件,默认false
10. checkForGorruptJournalFiles:在启动的时候,将会验证消息文件是否损坏,默认false
11. checksumJournalFiles: 是否为每个消息日志文件提供checksun,默认false
12. archiveDataLogs: 是否移动文件到特定的路径,而不是删除它们,默认false
13. directoryArchive: 定义消息已经被消费过后,移动data log到路径,默认null
14. databaseLockedWaitDelay: 获取数据库锁的等待时间(userd by shared master/slave),默认10000
15 maxAsyncJobs: 设置最大的可以存储的异步消息队列,默认值10000,可以和concurrent MessageProducers设置成一样的值。
16. concurrentStoreAndDispatchTransactions:是否分发消息到客户端,同时事务存储消息,默认为true.
17. concurrentStoreAndDispatchTopics:是否分发Topic消息到客户端,同时进行存储,默认为true.
18. concurrentStoreAndDispatchQueues:是否分发Queue消息到客户端,同时进行存储,默认为true.
6. 在Java中内嵌使用Broker,使用KahaDB的例子。
package com.wangx.activemq; import org.apache.activemq.broker.BrokerService;
import org.apache.activemq.store.kahadb.KahaDBStore; import java.io.File; public class MyBroker {
public static void main(String[] args) throws Exception {
BrokerService brokerService = new BrokerService();
File dataFileDir = new File("target/amq-in/kahadb");
KahaDBStore kahaDBStore = new KahaDBStore();
kahaDBStore.setDirectory(dataFileDir);
//use a bigger journal file
kahaDBStore.setJournalMaxFileLength(1024*100);
kahaDBStore.setIndexWriteBatchSize(100);
kahaDBStore.setEnableIndexWriteAsync(true);
brokerService.setPersistenceAdapter(kahaDBStore);
brokerService.addConnector("tcp://localhost:61616");
brokerService.start();
}
}
7. AMQ Message Store 概述
AMQ Message Store是ActiveMQ5.0缺省的持久化存储,它是一个基于文件,事务存储设计为快速消息存储的一个结构,该结构是以流的形式来进行消息交互的。
这种方式中,Message被保存到data logs中,同时被reference store进行索引以提高存取速度。Data logs 由一些单独的data log文件组成,缺省的文件大小是32M,如果某个消息的大小超过了data log文件的大小,那么可以修改配置以增加data log文件的大小。如果某个data log文件中的所有消息都被成功消费了,那么这个data log文件将会被标记,以便在下一轮的清理中被删除或者归档。
8. AMQ Message Store 配置示例
<broker brokerName="broker" persistent="true" useShutdownHook="false"> <persistenceAdapter>
<amqPersistenceAdapter directory="${activemq.base}/data" maxFileLength="32MB/> </persistenceAdapter>
</broker>
9. 使用JDBC来持久化消息
ActiveMQ支持使用JDBC来持久化消息,预定义的表如下:
1. 消息表,缺省表名为ACTIVEMQ ESGS queue和topic都存在里面,结构如下:

2. ACTIVEMQ_ACKS表存储持久化订阅的信息和最后一个持久订阅接收的消息ID,结构如下

2. 锁定表,缺省表名为ACTIVE_LOCK,用来确保某一时刻,只能有一个ActiveMQ broker实例来访问数据库,结构如下:

10. 使用JDBC来持久化消息的配置示例
<broker brokerName="test-broker" persistent="true"
xmlns="http://activemq.apache.org/schema/core">
<persistenceAdapter>
<jdbcPersistenceAdapter dataSource="#mysql-ds"/>
</persistenceAdapter>
</broker>
<!--需要加入对应版本的连接池依赖和数据库驱动jar-->
<bean name="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://localhost:3306/test_mq?relaxAutoCommit=true"/>
<property name="username" value="xing"/>
<property name="password" value="xing"/>
<property name="maxTotal" value="200"/>
<property name="poolPreparedStatements" value="true"/>
</bean>
11. JDBC Message Store with ActiveMQ Journal
这种方式克服了JDBC Store的不足,使用快速的缓存写入技术,大大的提高了性能,配置如下:
<beans>
<broker brokerName="test-broker" persistent="true"
xmlns="http://activemq.apache.org/schema/core">
<persistenceFactory>
<journalPersistenceAdapterFactory
journalLogFiles="4"
journalLogFileSize="32768"
useJournal="true"
useQuickJournal="true"
dataDirectory="activemq-data"/>
</persistenceFactory>
</broker>
</beans>
12 JDBC Store 和JDBC Message Store with ActiveMQ Journal的区别
1. Jdbc with journal 的性能优于jdbc,
2. Jdbc 用于master/slave模式的数据库共享
3. Jdbc with journal不能用于master/slave模式
5. 一般情况下,推荐使用Jdbc with journal
13. Memory Message Store
内存消息存储主要是存储所有的持久化消息在内存中,这里没有动态的缓存存在,所以你必须注意设置你的broker所在的JVM和内存限制。
配置示例如下:
<beans>
<broker brokerName="test-broker" persistent="true"
xmlns="http://activemq.apache.org/schema/core">
<transportConnectors>
<transportConnector uri="tcp://localhost:61635"/>
</transportConnectors>
</broker>
</beans>
在java中内嵌使用Broker,使用Memory的例子
package com.wangx.activemq;
import org.apache.activemq.broker.BrokerService;
public class MyBroker {
public static void main(String[] args) throws Exception {
BrokerService brokerService = new BrokerService();
brokerService.setPersistent(false);
brokerService.addConnector("tcp://localhost:61616");
brokerService.start();
}
}
ActiveMQ学习笔记(8)----ActiveMQ的消息存储持久化的更多相关文章
- ActiveMQ学习笔记(5)——使用Spring JMS收发消息
摘要 ActiveMQ学习笔记(四)http://my.oschina.net/xiaoxishan/blog/380446 中记录了如何使用原生的方式从ActiveMQ中收发消息.可以看出,每次 ...
- ActiveMQ学习系列(四)----消息持久化到mysql
前记:目前学习还比较杂乱,还未找到系统化地学习ActiveMq的方法.在网上看到消息持久化的demo,了解了一下,在此记录. 一.目前ActiveMq支持的持久化方法 url:http://activ ...
- ActiveMQ学习笔记(17)----Message高级特性(一)
1. Messaage Properties ActiveMQ支持很多消息属性,具体可以参考 http://activemq.apache.org/activemq-message-propertie ...
- ActiveMQ学习笔记(1)----初识ActiveMQ
1. 什么是ActiveMQ? ActiveMQ是Apache推出的,一款开源的,完全支持JMS1.1和j2ee1.4规范的JMS Provider实现的消息中间件(Message Oriented ...
- 学习笔记-记ActiveMQ学习摘录与心得(二)
上个周末被我玩过去了,罪过罪过,现在又是一个工作日过去啦,居然有些烦躁,估计这几天看的东西有点杂,晚上坐下来把自己首要工作任务总结总结.上篇学习博客讲了ActiveMQ的特性及安装部署,下面先把我以前 ...
- apache activemq 学习笔记
0.activemq的概念 activemq实现了jms(java Message server),用于接收,发送,处理消息的开源消息总线. 1.activemq和jms的区别 jms说白了就是jav ...
- ActiveMQ学习笔记(一) JMS概要
(一)什么是JMS jms即Java消息服务(Java Message Service)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送 ...
- 学习笔记-记ActiveMQ学习摘录与心得(一)
这两天在看开源的MQ技术,趁着晚上安静,把这两天学的东西摘录下.在公司学东西效率真心捉鸡,心里总觉得别扭,拿了公司的钱不干活还在那学习,表示心情不淡定,效率不行啊...晚上时间是我的,下班还是蛮开心的 ...
- activemq学习笔记2
基本步骤: ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://127.0.0.1:61616"); ...
随机推荐
- Android和IOS等效MD5加密
最近在Android和IOS上都需要对用户的某些输入进行简单的加密,于是采用MD5加密方式. 首先将目的字符串加密一次,获得32位字符串 然后将32位字符串拆为2段,分别加密1次 最后将加密后的2段拼 ...
- 解决PL/SQL管理工具database下拉为空和登录出现ORA-12154
前言:昨天捣鼓了一下午,终于可以用plsql连接上oracle了... 测试环境:win10 注意问题: (一).环境变量 我发现按网上别人说的那一大推环境配置,很容易出错,我把它们全删了,就留了两个 ...
- Pyhton学习——Day30
# 内核态# 用户态# 操作系统的运行是在BOIS启动盘读取代码,从硬盘读取到内存中,被操作系统的内核中,一直存在在内存中# 计算机系统的三层结构:应用软件-->操作系统-->硬件# 一般 ...
- luogu p1004
P1004 题意 类似一个比较小的方格(N<=9),有的点是0,有的点有数, A->B的路径经过的点加上该点代表的数,求两次A->B的最大解(最优解) 一个令人恼的问题是两条路径如果 ...
- HDU 2049 不容易系列之(4)——考新郎( 错排 )
链接:传送门 思路:错排水题,从N个人中选出M个人进行错排,即 C(n,m)*d[m] 补充:组合数C(n,m)能用double计算吗?第二部分有解释 Part 1. 分别求出来组合数的分子和分母然后 ...
- CF487E Tourists(圆方树+堆+链剖)
本题解并不提供圆方树讲解. 所以不会圆方树的出门右转问yyb 没有修改的话圆方树+链剖. 方点的权值为点双连通分量里的最小值. 然后修改的话圆点照修,每一个方点维护一个小根堆. 考虑到可能被菊花卡死. ...
- VUE:内置指令与自定义指令
VUE:内置指令与自定义指令 常用的内置指令 1)v:text 更新元素的 textContent 2)v-html 更新元素的 innerHTML 3)v-if 如果为true,当前标签才会输出到页 ...
- C# 上位机的USB设备拔插检测
我们做USB通信时,通信成功后,往往要检测USB设备的拔插状态,这里就USB拔插进行一下说明. 参考:https://www.imooc.com/article/17438 先说明一下,我这里只是用C ...
- LaTeX 插图片
本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50240371 这里列出3种LaTeX中 ...
- Nodejs RESTFul架构实践之api篇(转)
why token based auth? 此段摘自 http://zhuanlan.zhihu.com/FrontendMagazine/19920223 英文原文 http://code.tuts ...