ActiveMQ消息存储持久化

---------------------------------------------------------------------------------------------------
ActiveMQ提供了插件式的消息存储,主要有有如下几种:
1.AMQ消息存储-基于文件的存储方式,是以前的默认消息存储
2.KahaDB消息存储-提供了容量的提升和恢复能力,是现在的默认存储方式
3.JDBC消息存储-消息基于JDBC存储的
4.Memory消息存储-基于内存的消息存储
下面就分别进行介绍:
(1)kahaDB Message Store概述
KahaDB是目前默认的存储方式,可用于任何场景,提高了性能和恢复能力。消息存储使用一个事务日志和仅仅用一个索引文件来存储它所有的地址。
KahaDB是一个专门针对消息持久化的解决方案,它对典型的消息使用模式进行了优化。在kaha中,数据被追加到 data logs中。 当不再需要log文件中的数据的时候,log文件会被丢弃。
KahaDB基本配置如下:

可用的属性有:
1. director: KahaDB存放的路径,默认值activemq-data
2. indexWriteBatchSize: 批量写入磁盘的索引page数量,默认值为1000
3. indexCacheSize: 内存中缓存索引page的数量,默认值10000
4. enableIndexWriteAsync: 是否异步写出索引,默认false
5. journalMaxFileLength: 设置每个消息data log的大小,默认是32MB
6. enableJournalDiskSyncs: 设置是否保证每个没有事务的内容,被同步写入磁盘,JMS持久化的时候需要,默认为true
7. cleanupInterval: 在检查到不再使用的消息后,在具体删除消息前的时间,默认30000
8. checkpointInterval: checkpoint的间隔时间,默认是5000
9. ignoreMissingJournalfiles: 是否忽略丢失的消息日志文件,默认false
10. checkForCorruptJournalFiles: 在启动的时候,将会验证消息文件是否损坏,默认false
11. checksumJournalFiles: 是否为每个消息日志文件提供checksum,默认false
12. archiveDataLogs: 是否移动文件到特定的路径,而不是删除它们,默认false
13. directoryArchive: 定义消息已经被消费过后,移动data log到的路径,默认null
14. databaseLockedWaitDelay: 获得数据库锁的等待时间(used by shared master/slave),默认10000
15. maxAsyncJobs: 设置最大的可以存储的异步消息队列,默认值10000,可以和concurrent MessageProducers设置成一样的值。
16. concurrentStoreAndDispatchTransactions:是否分发消息到客户端,同时事务存储消息,默认true
17. concurrentStoreAndDispatchTopics: 是否分发Topic消息到客户端,同时进行存储,默认true
18. concurrentStoreAndDispatchQueues: 是否分发queue消息到客户端,同时进行存储,默认true
(2)AMQ Message Store概述
AMQ Message Store是ActiveMQ5.0缺省的持久化存储,它是一个基于文件、事务存储设计为快速消息存储的一个结构,该结构是以流的形式来进行消息交互的。
这种方式中,Messages被保存到data logs中,同时被reference store进行索引以提高存取速度。Data logs由一些简单的data log文件组成,缺省的文件大小是32M,如果某个消息的大小超过了data log文件的大小,那么可以修改配置以增加data log文件的大小。如果某个data log文件中所有的消息都被成功消费了,那么这个data log文件将会被标记,以便在下一轮的清理中被删除或者归档。
AMQ Message Store配置示例:

(3)使用JDBC来持久化消息
ActiveMQ支持使用JDBC来持久化消息,预定义的表如下:
1.消息表,缺省表明为ACTIVEMQ_MSGS, queue和topic都存储在里面,结构如下:

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

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

使用JDBC来持久化消息的配置示例:
在activemq.xml中的配置如下:
<broker brokerName="test-broker" persistent=true xmlns="http://activemq.apache.org/schema/core">
<persistenceAdapter>
<jdbcPersistenceAdapter dataSource="#mysql_ds">
</persistenceAdapter>
</broker>
<bean name="mysql_ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName">
<value>org.gjt.mm.mysql.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://192.168.1.102:3306/test?useUnicode=true&characterEncoding=UTF-8</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value>123123</value>
</property>
</bean>
JDBC Message Store with ActiveMQ Journal
这种方式克服了JDBC Store的不足,使用快速的缓存写入技术,大大提高了性能。
配置如下:
<beans>
<broker brokerName="test-broker" xmlns="http://activemq.apache.org/schema/core">
<persistenceFactory>
<journalPersistenceAdapterFactory journalLogFiles="4" journalLogFileSize="32768"
useJournal="true" useQuickJournal="true" dataSource="#mysql_ds" dataDirectory="activemq-data">
</persistenceFactory>
</broker>
</beans>
JDBC Store和JDBC Message Store with ActiveMQ Journal的区别:
1. JDBC with journal的性能优于jdbc
2. JDBC用于master/slave模式的数据库分享
3. JDBC with journal不能用于master/slave模式
4. 一般情况下,推荐使用jdbc with journal
(4)Memory Message Store
内存消息存储主要是存储所有的持久化的消息在内存中。这里没有动态的缓存存在,所以你必须注意设置你的broker所在的JVM和内存限制。
<beans>
<broker brokerName="test_broker" persistent="false" xmlns="http://activemq.apache.org/schema/core">
<transportConnectors>
<transportConnector uri="tcp://localhost:61635">
</transportConnectors>
</beans>
ActiveMQ消息存储持久化的更多相关文章
- ActiveMQ 消息存储持久化
ActiveMQ提供了一个插件式的消息存储,类似于消息的多点传播,主要实现了如下几种: AMQ消息存储-基于文件的存储方式,是以前的默认消息存储 KahaDB消息存储-提供了容量的提升和恢复能力,是现 ...
- activemq的高级特性:消息存储持久化
activemq的高级特性之消息存储持久化 有基于文件的,数据库的,内存的.默认的是基于文件的,在安装目录/data/kahadb.在conf/activemq.xml文件中. <persist ...
- 分布式-信息方式-ActiveMQ的消息存储持久化
ActiveMQ的消息存储持久化■概述ActiveMQ不仅支持 persistent和 non-persistent两种方式,还支持消息的恢复( recovery)方式PTPQueue的存储是很简单的 ...
- 深入浅出 JMS(四) - ActiveMQ 消息存储
深入浅出 JMS(四) - ActiveMQ 消息存储 一.消息的存储方式 ActiveMQ 支持 JMS 规范中的持久化消息与非持久化消息 持久化消息通常用于不管是否消费者在线,它们都会保证消息会被 ...
- ActiveMQ(4) ActiveMQ JDBC 持久化 Mysql 数据库
ActiveMQ 消息持久化机制: ActiveMQ 消息的持久化机制有 JDBC.AMQ.KahaDB 和 LevelDB,其中本示例版本(5.15.2)默认机制为 KahaDB.无论哪种持久化机制 ...
- 【ActiveMQ】持久化消息队列的三种方式
1.ActiveMQ消息持久化方式,分别是:文件.mysql数据库.oracle数据库 2.修改方式: a.文件持久化: ActiveMQ默认的消息保存方式,一般如果没有修改过其他持久化方式的话可以不 ...
- ActiveMQ消息持久化到Mysql数据库
1.把连接MySQL数据库的jar文件,放到ActiveMQ的lib目录下 2.修改ActiveMQ的conf目录下的activemq.xml文件,修改数据持久化的方式2.1 修改原来的kahadb的 ...
- JMS学习八(ActiveMQ消息持久化)
ActiveMQ的消息持久化机制有JDBC,AMQ,KahaDB和LevelDB,还有一种内存存储的方式,由于内存不属于持久化范畴,而且如果使用内存队列,可以考虑使用更合适的产品,如ZeroMQ.所以 ...
- ActiveMQ学习笔记(8)----ActiveMQ的消息存储持久化
1. 概述 ActiveMQ不仅支持persistent和non-persistent两种方式,还支持消息的恢复(recovery)方式. 2. PTP Queue的存储是很简单的,其实就是FIFO的 ...
随机推荐
- linux中通配符和常用特殊符号
1 通配符 2 特殊符号 3 参考文档 鸟哥的私房菜 http://vbird.dic.ksu.edu.tw/linux_basic/0320bash_4.php#settings_wildcar ...
- TCP通信丢包原因总结
今天在公司问老大,公司的项目底层,是使用的TCP,因为可靠,自动断线重连,在底层都实现了,但是我记得TCP也会有掉包的问题,所以这文章就诞生了——关于TCP掉包的问题,TCP是基于不可靠的网络实现可靠 ...
- java笔记
ANT概述:http://www.blogjava.net/amigoxie/archive/2007/11/09/159413.html http://baitai.iteye.com/blog/7 ...
- A book to recommend: The art of readable code
我最喜欢的一本书 - 教我如何写可读的代码 Two month fan of the book, from August - Oct. 2014; and then, started to pract ...
- 面试问题5:const 与 define 宏定义之间的区别
问题描述:const 与 define 宏定义之间的区别 (1) 编译器处理方式不同 define宏是在预处理阶段展开: const常量是编译运行阶段使用: (2) 类型和安全检查不同 ...
- POJ 2955 Brackets --最大括号匹配,区间DP经典题
题意:给一段左右小.中括号串,求出这一串中最多有多少匹配的括号. 解法:此问题具有最优子结构,dp[i][j]表示i~j中最多匹配的括号,显然如果i,j是匹配的,那么dp[i][j] = dp[i+1 ...
- java操作Redis
需要使用如下jar包 <!-- https://mvnrepository.com/artifact/redis.clients/jedis --> <dependency> ...
- [CareerCup] 1.1 Unique Characters of a String 字符串中不同的字符
1.1 Implement an algorithm to determine if a string has all unique characters. What if you cannot us ...
- 读深入了解c++内核对象模型小结(1/3/4)
之前早就听说这本书不错,如果想对c++进一步的了解可以看看,此书是进阶阶段参考,笔者自己看了书的第一.三.四章节,后面会继续. 第一章讲了c++的对象模型的引入,各种模型的对比和现在c++采 ...
- 分形之概率学下的green tree
今天做的是分形之随机概率,可以和以前做的那个抛色子的做法非常相似,抛色子是用随机点数控制图形,今天做的树叶图形只是用概率的做法去控制图形而已,做法是如出一辙的: //图形界面 package ...