JMS学习六(ActiveMQ消息传送模型)
Posted 南望孤笑
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JMS学习六(ActiveMQ消息传送模型)相关的知识,希望对你有一定的参考价值。
ActiveMQ 支持两种截然不同的消息传送模型:PTP(即点对点模型)和Pub/Sub(即发布 /订阅模型),分别称作:PTP Domain 和Pub/Sub Domain。
一、PTP消息传送模型
1、PTP(使用Queue 即队列目标) 消息从一个生产者传送至一个消费者。在此传送模型中,目标是一个队列。消息首先被传送至队列目标,然后根据队列传送策略,从该队列将消息传送至向此队列进行注册的某一个消费者,一次只传送一条消息。可以向队列目标发送消息的生产者的数量没有限制,但每条消息只能发送至、并由一个消费者成功使用。如果没有已经向队列目标注册的消费者,队列将保留它收到的消息,并在某个消费者向该队列进行注册时将消息传送给该消费者。
2、PTP消息传送模型特性:
(1)、如果在session关闭时,有一些消息已经被收到但还没有签收那么当消费者下次连接到相同的队列时,这些消息还会被再次推送。(消息的被消费是分三个阶段的,不满足任何一个都会被视为未消费)
(2)、在上篇文章中我们学习了消息过滤器,如果消息不满足消费条件则这些消息是不会被消费的,这些消息会留在队列中。
(3)、队列可以长久的保存消息直到有消费者来消费消息,消费者不需要关心消息生产者的连接状态,这充分体现了异步传输的优势!
二、Pub/Sub消息传送模型(发送/订阅模型)----不支持负载均衡
1、Pub/Sub(使用 Topic即主题目标) 消息从一个生产者传送至任意数量的消费者。在此传送模型中,目标是一个主题。消息首先被传送至主题目标,然后传送至所有已订阅此主题的活动消费者。可以向主题目标发送消息的生产者的数量没有限制,并且每个消息可以发送至任意数量的订阅消费者。主题目标也支持持久订阅的概念。持久订阅表示消费者已向主题目标进行注册,但在消息传送时此消费者可以处于非活动状态。当此消费者再次处于活动状态时,它将接收此信息。如果没有已经向主题目标注册的消费者,主题不保留其接收到的消息,除非有非活动消费者注册了持久订阅。
2、Pub/Sub消息传送模型特性:
(1)、消息的订阅分为非持久订阅和持久订阅,非持久订阅,只有当客户端(消息消费者)处于激活状态时也就是消息消费者和消息服务保持连接状态时才能收到发送到某个Topic(主题)的消息,而当消息消费者处于离线状态时发到主题的消息将会丢失,永远不会收到。持久订阅能接收到消息消费者和消息服务端断开期间发送到某个Topic(主题)
的消息即消息消费者在次连接到消息服务时能收到这期间发送的消息。
(2)、和PTP模式一样,在消费消息时有选择器,不满足条件的消息时不会被消费,不消费的消息还是留在了Topic(主题)中。
(3)、非持久订阅状态下,不能恢复或重新派送一个未签收的消息,只有持久订阅才能恢复或重新派送一个未消费的消息。
(4)、在应用中不能容忍有消息丢失则使用持久订阅,而如果能容忍消息丢失则使用费持久订阅,持久订阅和非持久订阅两个的性能还是有很大的却别的,因为要持久订阅的话第一个要求就是消息要持久化,而非持久订阅则不用进行消息的持久化所以效率较高,所以在应用中使用哪种订阅方式还是要慎重,三思!!!
三、实例
在这里就不贴代码了因为在第二篇文章中已经写了两种传送模式的demo如果需要可以看看:PTP、Pub/Sub 传送模型文章
以上是关于JMS学习六(ActiveMQ消息传送模型)的主要内容,如果未能解决你的问题,请参考以下文章
基于Tomcat + JNDI + ActiveMQ实现JMS的点对点消息传送
深入浅出JMS--ActiveMQ简单的HelloWorld实例