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的基本配置例子

  

  1. <persistenceAdapter>
  2.  
  3.     <kahaDB directory="${activemq.data}/kahadb"/>
  4.  
  5.   </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的例子。

  1. package com.wangx.activemq;
  2.  
  3. import org.apache.activemq.broker.BrokerService;
  4. import org.apache.activemq.store.kahadb.KahaDBStore;
  5.  
  6. import java.io.File;
  7.  
  8. public class MyBroker {
  9. public static void main(String[] args) throws Exception {
  10. BrokerService brokerService = new BrokerService();
  11. File dataFileDir = new File("target/amq-in/kahadb");
  12. KahaDBStore kahaDBStore = new KahaDBStore();
  13. kahaDBStore.setDirectory(dataFileDir);
  14. //use a bigger journal file
  15. kahaDBStore.setJournalMaxFileLength(1024*100);
  16. kahaDBStore.setIndexWriteBatchSize(100);
  17. kahaDBStore.setEnableIndexWriteAsync(true);
  18. brokerService.setPersistenceAdapter(kahaDBStore);
  19. brokerService.addConnector("tcp://localhost:61616");
  20. brokerService.start();
  21. }
  22. }

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 配置示例

 

  1.  <broker brokerName="broker" persistent="true" useShutdownHook="false">
  2.  
  3.     <persistenceAdapter>
  4.       <amqPersistenceAdapter directory="${activemq.base}/data" maxFileLength="32MB/>
  5.  
  6.     </persistenceAdapter>
  7.   </broker>

9. 使用JDBC来持久化消息

  ActiveMQ支持使用JDBC来持久化消息,预定义的表如下:

  1. 消息表,缺省表名为ACTIVEMQ ESGS queue和topic都存在里面,结构如下:

    

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

  

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

  

10. 使用JDBC来持久化消息的配置示例

  1. <broker brokerName="test-broker" persistent="true"
  2. xmlns="http://activemq.apache.org/schema/core">
  3. <persistenceAdapter>
  4. <jdbcPersistenceAdapter dataSource="#mysql-ds"/>
  5. </persistenceAdapter>
  6. </broker>
  7. <!--需要加入对应版本的连接池依赖和数据库驱动jar-->
  8.   <bean name="mysql_ds" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
  9.    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
  10.    <property name="url" value="jdbc:mysql://localhost:3306/test_mq?relaxAutoCommit=true"/>
  11.    <property name="username" value="xing"/>
  12.    <property name="password" value="xing"/>
  13.    <property name="maxTotal" value="200"/>
  14.    <property name="poolPreparedStatements" value="true"/>
  15. </bean>

11. JDBC Message Store with ActiveMQ Journal

  这种方式克服了JDBC Store的不足,使用快速的缓存写入技术,大大的提高了性能,配置如下:

  1. <beans>
  2. <broker brokerName="test-broker" persistent="true"
  3. xmlns="http://activemq.apache.org/schema/core">
  4. <persistenceFactory>
  5. <journalPersistenceAdapterFactory
  6. journalLogFiles="4"
  7. journalLogFileSize="32768"
  8. useJournal="true"
  9. useQuickJournal="true"
  10. dataDirectory="activemq-data"/>
  11. </persistenceFactory>
  12. </broker>
  13. </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和内存限制。

  配置示例如下:

  1. <beans>
  2. <broker brokerName="test-broker" persistent="true"
  3. xmlns="http://activemq.apache.org/schema/core">
  4. <transportConnectors>
  5. <transportConnector uri="tcp://localhost:61635"/>
  6. </transportConnectors>
  7. </broker>
  8. </beans>

  在java中内嵌使用Broker,使用Memory的例子

  1. package com.wangx.activemq;
  2.  
  3. import org.apache.activemq.broker.BrokerService;
  4.  
  5. public class MyBroker {
  6. public static void main(String[] args) throws Exception {
  7. BrokerService brokerService = new BrokerService();
  8. brokerService.setPersistent(false);
  9. brokerService.addConnector("tcp://localhost:61616");
  10. brokerService.start();
  11. }
  12. }

ActiveMQ学习笔记(8)----ActiveMQ的消息存储持久化的更多相关文章

  1. ActiveMQ学习笔记(5)——使用Spring JMS收发消息

      摘要 ActiveMQ学习笔记(四)http://my.oschina.net/xiaoxishan/blog/380446 中记录了如何使用原生的方式从ActiveMQ中收发消息.可以看出,每次 ...

  2. ActiveMQ学习系列(四)----消息持久化到mysql

    前记:目前学习还比较杂乱,还未找到系统化地学习ActiveMq的方法.在网上看到消息持久化的demo,了解了一下,在此记录. 一.目前ActiveMq支持的持久化方法 url:http://activ ...

  3. ActiveMQ学习笔记(17)----Message高级特性(一)

    1. Messaage Properties ActiveMQ支持很多消息属性,具体可以参考 http://activemq.apache.org/activemq-message-propertie ...

  4. ActiveMQ学习笔记(1)----初识ActiveMQ

    1. 什么是ActiveMQ? ActiveMQ是Apache推出的,一款开源的,完全支持JMS1.1和j2ee1.4规范的JMS Provider实现的消息中间件(Message Oriented ...

  5. 学习笔记-记ActiveMQ学习摘录与心得(二)

    上个周末被我玩过去了,罪过罪过,现在又是一个工作日过去啦,居然有些烦躁,估计这几天看的东西有点杂,晚上坐下来把自己首要工作任务总结总结.上篇学习博客讲了ActiveMQ的特性及安装部署,下面先把我以前 ...

  6. apache activemq 学习笔记

    0.activemq的概念 activemq实现了jms(java Message server),用于接收,发送,处理消息的开源消息总线. 1.activemq和jms的区别 jms说白了就是jav ...

  7. ActiveMQ学习笔记(一) JMS概要

    (一)什么是JMS jms即Java消息服务(Java Message Service)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送 ...

  8. 学习笔记-记ActiveMQ学习摘录与心得(一)

    这两天在看开源的MQ技术,趁着晚上安静,把这两天学的东西摘录下.在公司学东西效率真心捉鸡,心里总觉得别扭,拿了公司的钱不干活还在那学习,表示心情不淡定,效率不行啊...晚上时间是我的,下班还是蛮开心的 ...

  9. activemq学习笔记2

    基本步骤: ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://127.0.0.1:61616"); ...

随机推荐

  1. RAP开发入门-运行第一个HelloWorld(二)

    环境搭建好了之后我们就可以照惯例运行第一个helloworld程序了. (ps:这里钉几个资料吧 官网开发指导:http://help.eclipse.org/indigo/index.jsp?top ...

  2. 如何将App从一个账号迁移到另一个账号?

    App迁移(App transfer):将App从一个开发者账号迁移至另一个开发者账号.此文演示了整个迁移过程,为了方便解释,在此过程中,将App转出的开发者账号我们下文将会称之为A账号,接收杭州Ap ...

  3. ABBYY简体中文版终身授权半价来袭,真的是5折!

    经过了一个春秋,心心念念的双十一终于要来了,一年时间并不长,但这一个月尤其慢!ABBYY官方称为回馈广大用户的支持与厚爱,双十一期间,ABBYY价格感人,诱惑难挡. 说到双十一活动,方式也是五花八门, ...

  4. my.cnf配置样例

    [mysql] no-auto-rehash port = socket = /data/mysql/data/mysqld.sock [mysqld] user = mysql port = bas ...

  5. Pyhton学习——Day36

    #异步IO——Asynchronous#异步效率最高,特点:全程无阻塞# 在说明synchronous IO和asynchronous IO的区别之前,需要先给出两者的定义.# Stevens给出的定 ...

  6. Day 07 -02 拷贝 浅拷贝 深拷贝

    必考 存一个值还是多个值 一个值:整型/浮点型/字符串 多个值:列表/元祖/字典/集合 有序or 无序 有序:字符串/列表/元祖 无序:字典/集合 可变or 不可变 可变:列表/字典/集合 不可变:整 ...

  7. 数据库常用sql语句积累

    组合一个新表 select p.*,(select value from as_info where key = 'v51_products') as v51_products from AP_POR ...

  8. SOAP扩展PHP轻松实现WebService

    最近在一个PHP项目中对接外部接口涉及到WebService,搜索引擎上相关文章不是很多,找到的大都是引用一个号称很强大的开源软件 NuSOAP(下载地址:http://sourceforge.net ...

  9. debian 9 添加源

    1.将下面内容的添加入/etc/apt/sources.list(香港镜像) #For software deb http://mirrors.ustc.edu.cn/debian/ stretch ...

  10. Vue官网todoMVC示例

    这个示例是模仿官网示例样式和功能用我自己的方式写的,基本上没有看官网的源码,只参考自定义指令.让我们一步步来探讨一下.官网demo 要实现的功能 单条添加todo 单条删除todo 双击编辑todo ...