1,JMS规范支持两种类型的消息传递:persistent and non-persistent。ActiveMQ在支持这两种类型的传递方式时,还支持消息的恢复、中间状态的消息(message are cached in memory)

2,ActiveMQ可将消息存储在三种类型介质中:file-based(存储在文件中)、in-memory(存储在内存中)、relational databases(存储在关系数据库中)

3,Persistence Message有何用处?

Persistent messages are ideal if you want messages to always be available to a message consumer after they have been delivered to a message broker, or you need messages to survive even if there has been a system failure。

①消息对消费者总是可用。②系统宕机后,消息不被丢失。

4,ActiveMQ中存储两种Destination,主题(Topic)与 队列(Queue)。主题对应的Domain是发布-订阅模型(Pub/Sub),队列对应的Domain是点对点模型(P2P)。

队列存储:按FIFO的顺序存储消息,Only one message is dispatched between one of potentially many consumers. Only when that message has been consumed and acknowledged can it be deleted from the broker's message store.

对于众多的消费者,只有其中一个消费者可以接收该消息。也只有当消费者消费了之后,该消息才能删除。

Topic存储:

For durable subscribers to a topic, each consumer gets a copy of the message. In order to save space (some messages can be very large!), only one copy of a message is stored by the broker.

什么是durable subscribers(持久订阅者)?对于 durable subscribers而言,尽管当前它是不活跃的(没有连接到borker),也不会错失发给broker的消息(类似于QQ的离线消息)。持久订阅者维护者一个消息指针,指针总是指向该订阅者需要的下一个消息。

A durable subscriber object in the store maintains a pointer to its next stored message and dispatches a copy of it to its consumer as shown in Figure 5.2.

为什么要这样设计?

①每个消费者消费速率是不同的

②不是所有的消费者都在线(actived)

③同一个消息可能被多个消费者订阅

通过指针这种形式,可以很好地解决上面三种情况下出现的问题。只有当所有的消费者都获得了该消息时,消息才能从broker中删除。

5,ActiveMQ中消息存储的方式:

ActiveMQ provides a pluggable API for message stores as well as multiple message store implementations including:

①AMQ Message Store

②KahaDB Message Store,ActiveMQ 5.13.2版本默认的存储方式

③JDBC Message Store

在配置文件activemq.xml中有存储方式的配置选项:

AMQ存储方式的实现思想非常值得一看:

The Journal consists of a rolling log of messages and commands (such as transactional boundaries and message deletions) stored in data files of a certain length. When the maximum length of the currently used data file has been reached a new data file is created. All the messages in a data file are reference counted, so that once every message in that data file is no longer required, the data file can be removed or archived. The journal only appends messages to the end of the current data file, so storage is very fast.

存储Journal的文件是定长的,并且只以append方式向文件写入日志。

为了方便,直接截图了。

KahaDB 消息存储方式就不截图了。AMQ方式采用HashTable存储Reference Index,而KahaDB采用B-Tree存储索引。

此外,关于配置ActiveMQ使用JDBC作为持久存储的方法,参考这篇文章

6,Broker为Consumer缓存消息

由于第5点中讲到,消息存储到持久介质中,因此就不适用那些需要实时消息的场合。---比如,交易信息需要在秒级时间内获得,用完之后就不再需要它了。

因此,ActiveMQ可以配置缓存哪种类型的消息、缓存多少消息、这些消息缓存多久?

Messages that are cached by the broker are only dispatched to a topic consumer if it is retroactive; and never to durable topic subscribers

http://www.cnblogs.com/hapjin/p/5438377.html

JMS学习(三)ActiveMQ Message Persistence(转)相关推荐

  1. JMS学习十 ActiveMQ支持的传输协议

    JMS学习(ActiveMQ支持的传输协议) ActiveMQ提供了一种连接机制,这种连接机制使用传输连接器(TransportConnector)实现客户端与代理(client - to - bro ...

  2. JMS学习(五)--ActiveMQ中的消息的持久化和非持久化 以及 持久订阅者 和 非持久订阅者之间的区别与联系...

    一,消息的持久化和非持久化 ①DeliveryMode 这是传输模式.ActiveMQ支持两种传输模式:持久传输和非持久传输(persistent and non-persistent deliver ...

  3. JMS学习(2):ActiveMQ简单介绍以及安装

    现实的企业中,对于消息通信的应用一直都非常的火热,而且在J2EE的企业应用中扮演着特殊的角色,所以对于它研究是非常有必要的. 上篇博文深入浅出JMS(一)–JMS基本概念,我们介绍了消息通信的规范JM ...

  4. JMS学习三(ActiveMQ消息的可靠性)

    下面我们来学习一下消息接受确认和发送持久化消息.消息的过期.消息的选择器和消息的优先级. 一.消息接收确认 1.jms消息只有在被确认之后才认为成功消费了这条消息.消息的成功消费通常包括三个步骤:(1 ...

  5. JMS学习(3):--ActiveMQ简单的HelloWorld实例

    第一篇博文深入浅出JMS(一)–JMS基本概念,我们介绍了JMS的两种消息模型:点对点和发布订阅模型,以及消息被消费的两个方式:同步和异步,JMS编程模型的对象,最后说了JMS的优点. 第二篇博文深入 ...

  6. JMS学习九 ActiveMQ的消息持久化到Mysql数据库

    1.将连接Mysql数据库驱动包,放到ActiveMQ的lib目录下 2,修改ActiveMQ的conf目录下的active.xml文件,修改数据持久化的方式 2.1  修改原来的kshadb的持久化 ...

  7. JMS学习十一 ActiveMQ Consumer高级特性之独有消费者(Exclusive Consumer)

    一.简介 Queue中的消息是按照顺序被分发到consumers的.然而,当你有多个consumers同时从相同的queue中提取消息时, 你将失去这个保证.因为这些消息是被多个线程并发的处理.有的时 ...

  8. JMS学习六(ActiveMQ消息传送模型)

    JMS学习六(ActiveMQ消息传送模型) ActiveMQ 支持两种截然不同的消息传送模型:PTP(即点对点模型)和Pub/Sub(即发布 /订阅模型),分别称作:PTP Domain 和Pub/ ...

  9. JMS学习八(ActiveMQ消息持久化)

    JMS学习八(ActiveMQ消息持久化) ActiveMQ的消息持久化机制有JDBC,AMQ,KahaDB和LevelDB,还有一种内存存储的方式,由于内存不属于持久化范畴,而且如果使用内存队列,可 ...

最新文章

  1. 八皇后的一个回溯递归解法
  2. java访问map_java.map使用
  3. 2014c语言二级考试题,2014计算机二级等级考试试题:C语言模拟题
  4. layui日期与vue_详解Vue.js和layui日期控件冲突问题解决办法
  5. LD(Levenshtein distance)莱文斯坦距离----编辑距离
  6. XDP(eXpress Data Path)防御DDoS攻击
  7. 五大算法之三--贪心算法
  8. 关于CleanMyMac常见问题与解答
  9. android 应用开发(第70章)---二维码
  10. ubuntu21.04美化使用
  11. 主板 B85 + 核显HD4600 , EFI 安装黑苹果
  12. 51单片机外设篇:LED点阵
  13. matlab三维向量,matlab三维数据绘图
  14. Java Web 开发后续(四)
  15. 马光远:阿里巴巴收购雅虎胜算几何
  16. 【Pytorch学习笔记三】Pytorch神经网络包nn和优化器optm(一个简单的卷积神经网络模型的搭建)
  17. 计算机专业押韵口号16字,最牛班级口号霸气押韵16字
  18. 黑客专业cookie利用浏览器插件CookieHacker By 黑岩
  19. S7 200 smart高速计数功能应用
  20. Rust 新手入门系列课程 | Databend 社区

热门文章

  1. 【转】【OPenGL】OPenGL 画图板-- 中点算法画圆
  2. Vue插槽(solt)简单案例
  3. 深入理解JVM虚拟机-Ubuntu中安装openJDK
  4. Effective_STL 学习笔记(二)小心对 “容器无关代码” 的幻想
  5. mysql中floor函数的作用是什么?
  6. iOS开发UI篇—推荐两个好用的Xcode插件(提供下载链接)
  7. 基于OWIN WebAPI 使用OAuth授权服务【客户端验证授权(Resource Owner Password Credentials Grant)】...
  8. VSS 2005 配置简明手册
  9. WPF-005:关于使用PageFunction导航中KeepAlive的使用
  10. Citrix Xendesktop5中创建虚拟机失败的2个案例分析