ActiveMQ中,持久化是值对消息数据的持久化。在ActiveMQ中,默认的消息是保存在内存中的。当内存容量不足的时候,或ActiveMQ正常关闭的时候,会将内存中的未处理的消息持久化到磁盘中。具体的持久化策略是kahadb。如果使用JDBC作为持久化策略,则会将所有的需要持久化的消息保存到数据库中。

  所有持久化配置都在conf/activemq.xml中配置,配置信息都在broker标签内部定义。

一、kahadb方式

  kahadb是ActiveMQ默认的持久化策略。kahadb是一个文件型数据库。是使用内存+文件保证数据的持久化的。kahadb可以限制每个数据文件的大小。不代表总计数据容量。

 <persistenceAdapter>
<!--directory:保存数据的目录;journalMaxFileLength:保存消息的文件大小-->
<kahaDB directory="${activemq.data}/kahadb" journalMaxFileLength="16mb" />
</persistenceAdapter>

  特性是:

  1,日志形式存储消息。

  2,消息索引以B-Tree结构存储,可以快速更新。

  3,完全支持JMS事物

  4,支持多种恢复机制

二、AMQ方式

  只适用于5.3版本以前。

  AMQ也是一个文件型数据库,消息信息最终是存储在存储文件中的,内存中也会有缓存数据。

 <persistenceAdapter>
<!--directory:保存数据的目录;maxFileLength:保存消息的大小-->
<amqPersistenceAdapter directory="${activemq.data}/amq" maxFileLength="32mb" />
</persistenceAdapter>

  性能高于JDBC,写入消息时,会将消息写入日志文件,由于是顺序追加写,性能很高。为了提升性能,创建消息主键索引,并且提供缓存机制,进一步提升性能。每个日志文件的大小都是有限制的(默认32m,可自行配置)。

  当超过这个大小,系统会重新建立一个文件,当所有的消息都消费完成,系统会删除这个文件或归档。

  主要缺点是AMQ Message会我每一个destination创建一个索引,如果使用了大量的queue,索引文件的大小会占用很多的磁盘空间。

  而且由于索引巨大,一旦Broker(ActiveMQ的应用实例)崩溃,重建索引的速度会非常慢。

  虽然AMQ性能略高于Kahadb方式,但由于其重建索引时间过长,而且索引文件占用磁盘空间过大,已经不再推荐使用。

三、JDBC持久化方式

  ActiveMQ将数据持久化到数据库中,不能限定具体的数据库,可以使用任意的数据库,下边我们以MySql为例。

  首先打开activemq.xml配置文件,首先定义一个mysql-ds的MySql数据源,然后在persistenceAdapter节点中配置jdbcPersistenceAdapter并且引用刚才定义的数据源。

  dataSource指定持久化的数据库bean,createTableOnStartUp是否在启动的时候创建数据库表,默认值是true,这样每次启动都会去创建数据库表了,一般是第一次启动的时候设置为true,之后改为false。

 <broker brokerName="test-broker" persistent="true" xmlns="http://activemq.apache.org/schema/core">
<persistenceAdapter>
<jdbcPersistenceAdapter dataSource="#mysql-ds" createTabelsOnStartUp="false">
</persistenceAdapter>
</broker>
<bean id="mysql-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://127.0.0.1/activemq?relaxAutoCommit=true" />
<property name="username" value="activemq" />
<property name="password" value="activemq" />
<property name="maxActive" value="200" />
<property name="poolPreparedStatements" value="true" />
</bean>

  配置成功后,需要在数据库中创建对应的database,否则无法访问,表格ActiveMQ可以自动创建。

  数据表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,数值越大优先级越高

  activemq_acks 用于存储订阅关系。如果是持久化Topic,订阅者和服务器的订阅关系在这个表保存,主要的数据库字段如下:

CONTAINER:消息的Destination

SUB_DEST:如果是使用Static 集群,这个字段会有集群其他系统的信息

CLIENT_ID:每个订阅者都必须有一个唯一的客户端ID 用以区分

SUB_NAME:订阅者名称

SELECTOR:选择器,可以选择只消费满足条件的消息。条件可以用自定义属性实现,可支持多属性AND 和OR 操作

LAST_ACKED_ID:记录消费过的消息的ID。

  表activemq_lock 在集群环境中才有用,只有一个Broker 可以获得消息,称为MasterBroker,其他的只能作为备份等待Master Broker 不可用,才可能成为下一个Master Broker。这个表用于记录哪个Broker 是当前的Master Broker。只有在消息必须保证有效,且绝对不能丢失的时候。使用JDBC 存储策略。如果消息可以容忍丢失,或使用集群/主备模式保证数据安全的时候,建议使用levelDB或Kahadb。

ActiveMQ持久化的更多相关文章

  1. ActiveMQ持久化方式(转)

    消息持久性对于可靠消息传递来说应该是一种比较好的方法,有了消息持久化,即使发送者和接受者不是同时在线或者消息中心在发送者发送消息后宕机了,在消息 中心重新启动后仍然可以将消息发送出去,如果把这种持久化 ...

  2. ActiveMQ持久化方式

    ActiveMQ持久化方式 发表于8个月前(2014-09-04 15:55)   阅读(686) | 评论(0) 17人收藏此文章, 我要收藏 赞1 慕课网,程序员升职加薪神器,点击免费学习 摘要  ...

  3. ActiveMQ持久化及测试(转)

    转:http://blog.csdn.net/xyw_blog/article/details/9128219 ActiveMQ持久化 消息持久性对于可靠消息传递来说应该是一种比较好的方法,有了消息持 ...

  4. ActiveMQ入门之四--ActiveMQ持久化方式

    消息持久性对于可靠消息传递来说应该是一种比较好的方法,有了消息持久化,即使发送者和接受者不是同时在线或者消息中心在发送者发送消息后宕机了,在消息中心重新启动后仍然可以将消息发送出去,如果把这种持久化和 ...

  5. ActiveMQ持久化到MySQL以及使用SSL协议通讯

    最近公司事情稍微少了点,研究下怎么优化几个系统的交互,因为我们目前使用的是长链接的同步接口,就考虑用下MQ来处理下.由于公司对安全有要求且和CA业务有关,则使用了SSL协议.此文使用的是Activem ...

  6. ActiveMQ持久化机制和JMS可靠消息

    1.ActiveMQ持久化机制 1.1 JDBC将数据持久化到数据库 1.2 AMQ生成日志文件 1.3 KahaDB:本次磁盘生成数据文件(默认) 1.4 LevelDB:谷歌K/V数据库 1.5 ...

  7. ActiveMQ持久化消息

    ActiveMQ的另一个问题就是只要是软件就有可能挂掉,挂掉不可怕,怕的是挂掉之后把信息给丢了,所以本节分析一下几种持久化方式: 一.持久化为文件 ActiveMQ默认就支持这种方式,只要在发消息时设 ...

  8. ActiveMQ持久化消息(转)

    ActiveMQ的另一个问题就是只要是软件就有可能挂掉,挂掉不可怕,怕的是挂掉之后把信息给丢了,所以本节分析一下几种持久化方式: 一.持久化为文件 ActiveMQ默认就支持这种方式,只要在发消息时设 ...

  9. ActiveMQ持久化消息的三种方式

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt362 本文只介绍三种方式,分别是持久化为文件,MYSql,Oracle.下面 ...

  10. ActiveMq持久化数据

    A:持久化为文件 这个你装ActiveMQ时默认就是这种,只要你设置消息为持久化就可以了.涉及到的配置和代码有 <persistenceAdapter> <kahaDB direct ...

随机推荐

  1. Scyther tool 入门

    1.Scyther 适合分析什么样的协议    首先协议分析工具并不是可以分析所有的协议,每种协议都有其自己适合的分析方法,并不都是可以使用形式化方法来分析. 目前协议分析方法: 模态逻辑分析(BAN ...

  2. C++ 谓词(predicate) 与 仿函数 ( functor (function object))

    谓词与函数对象 谓词 predicate C++ 标准定义谓词如下: The Predicate parameter is used whenever an algorithm expects a f ...

  3. P1169 [ZJOI2007]棋盘制作[悬线法/二维dp]

    题目描述 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8 \times 88×8大小的黑白相间的方阵,对应八八六十四卦,黑白 ...

  4. LG4721 【模板】分治 FFT

    P4721 [模板]分治 FFT 题目背景 也可用多项式求逆解决. 题目描述 给定长度为 $n-1$ 的数组 $g[1],g[2],..,g[n-1]$,求 $f[0],f[1],..,f[n-1]$ ...

  5. python_requests ~爬虫~小视频~~~

    当一只小小的Py_Spider也有一段时间了, 期间,更多的时间是在爬取图片啊, 文字, 文档这类的东西, 今天突然一时兴起, 来爬一手视频! 所以就找到了远近闻名的六间房(六扇门)哈哈,~~~ 1. ...

  6. SpringBoot官方文档学习(二)Externalized Configuration(外部化配置)

    Spring Boot允许您将配置外部化,以便可以在不同的环境中使用相同的应用程序代码.您可以使用属性文件.YAML文件.环境变量和命令行参数来具体化配置.属性值可以通过使用@Value注释直接注入b ...

  7. Kafka 基础操作

    cd /root/kafka/kafka_2.10-0.8.2.2/bin 1.查看kafka topic kafka-topics.sh --list --zookeeper 172.16.100. ...

  8. Qt文件读写操作

    原文地址:https://www.cnblogs.com/flowingwind/p/8336159.html QFile Class 1.read读文件 加载文件对象  QFile file(&qu ...

  9. stos指令

    mov ecx,30mov eax,0cccccccchrep stos dword prt es:[edi]stos指令,它的功能是将eax中的数据放入的edi所指的地址中,同时,edi会增加4个字 ...

  10. HTML5自定义属性操作

    一.自定义属性(html5标准)data-属性名称="属性值" 自定义属性的名称驼峰式命名规则需要用-隔开 自定义属性名称如果连在一起写,大写会自动转为小写 data-user=& ...