JMS开发(二):深入PTP,Pub-Sub两种模式
1.PTP模型
PTP(Point-to-Point)模型是基于队列(Queue)的,对于PTP消息模型而言,它的消息目的是一个消息队列(Queue),消息生产者每次发送消息总是把消息送入消息队列中,消息消费者总是从消息队列中读取消息.先进队列的消息将先被消息消费者读取.
发送方发消息到队列,接收方从队列接收消息,队列的存在使得消息的异步传输成为可能。和邮件系统中的邮箱一样,队列可以包含各种消息,JMS Provider 提供工具管理队列的创建、删除。JMS PTP 模型定义了客户端如何向队列发送消息,从队列接收消息,浏览队列中的消息.第一节中的代码就是PTP模型的.
下面的表格中的就是PTP模型的对象的主要概念和方法:
| 名称 | 描述 |
| Queue | 由JMS Provider 管理,队列由队列名识别,客户端可以通过JNDI 接口用队列名得到一个队列对象. |
| TemporaryQueue | 由QueueConnection 创建,而且只能由创建它的QueueConnection 使用.临时队列. |
| QueueConnectionFactory | 客户端用QueueConnectionFactory 创建QueueConnection 对象. |
| QueueConnection | 一个到JMS PTP provider 的连接,客户端可以用QueueConnection 创建QueueSession 来发送和接收消息. |
| QueueSession | 提供一些方法创建QueueReceiver,QueueSender,QueueBrowser 和TemporaryQueue.如果在QueueSession 关闭时,有一些消息已经被收到,但还没有被签收(acknowledged),那么,当接收者下次连接到相同的队列时,这些消息还会被再次接收. |
| QueueReceiver | 客户端用QueueReceiver 接收队列中的消息,如果用户在QueueReceiver中设定了消息选择条件,那么不符合条件的消息会留在队列中,不会被接收到. |
| QueueSender | 客户端用QueueSender 发送消息到队列 |
| QueueBrowser | 客户端可以QueueBrowser 浏览队列中的消息,但不会收走消息. |
| QueueRequestor | JMS 提供QueueRequestor 类简化消息的收发过程.QueueRequestor 的构造函数有两个参数:QueueSession 和queue,QueueRequestor 通过创建一个临时队列来完成最终的收发消息请求. |
| 可靠性(Reliability) | 队列可以长久地保存消息直到接收者收到消息.接收者不需要因为担心消息会丢失而时刻和队列保持激活的连接状态,充分体现了异步传输模式的优势. |
2.PUB/SUB模型
JMS Pub/Sub 模型定义了如何向一个内容节点发布和订阅消息,这些节点被称作主题(topic).
主题可以被认为是消息的传输中介,发布者(publisher)发布消息到主题,订阅者(subscribe) 从主题订阅消息.主题使得消息订阅者和消息发布者保持互相独立,不需要接触即可保证消息的传送.
下面描述JMS Pub/Sub 模型中的主要概念和对象:
| 订阅(subscription) | 消息订阅分为非持久订阅(non-durable subscription)和持久订阅(durable subscrip-tion),非持久订阅只有当客户端处于激活状态,也就是和JMS Provider 保持连接状态才能收到发送到某个主题的消息,而当客户端处于离线状态,这个时间段发到主题的消息将会丢失,永远不会收到.持久订阅时,客户端向JMS 注册一个识别自己身份的ID,当这个客户端处于离线时,JMS Provider 会为这个ID 保存所有发送到主题的消息,当客户再次连接到JMS Provider时,会根据自己的ID 得到所有当自己处于离线时发送到主题的消息. |
| Topic | 主题由JMS Provider 管理,主题由主题名识别,客户端可以通过JNDI 接口用主题名得到一个主题对象.JMS 没有给出主题的组织和层次结构的定义,由JMS Provider 自己定义. |
| TemporaryTopic | 临时主题由TopicConnection创建,而且只能由创建它的TopicConnection使用.临时主题不能提供持久订阅功能. |
| TopicConnectionFactory | 客户端用TopicConnectionFactory创建TopicConnection对象. |
| TopicConnection | TopicConnection是一个到JMS Pub/Sub provider的连接,客户端可以用TopicConnection创建TopicSession 来发布和订阅消息. |
| TopicSession | TopicSession 提供一些方法创建TopicPublisher,TopicSubscriber,TemporaryTopic.它还提供unsubscribe方法取消消息的持久订阅. |
| TopicPublisher | 客户端用TopicPublisher 发布消息到主题. |
| TopicSubscriber | 客户端用TopicSubscriber 接收发布到主题上的消息.可以在TopicSubscriber 中设置消息过滤功能,这样,不符合要求的消息不会被接收. |
| Durable TopicSubscriber | 如果一个客户端需要持久订阅消息,可以使用Durable TopicSubscriber,TopSession 提供一个方法createDurableSubscriber创建Durable TopicSubscriber 对象. |
| 恢复和重新派送(Recovery and Redelivery) | 非持久订阅状态下,不能恢复或重新派送一个未签收的消息.只有持久订阅才能恢复或重新派送一个未签收的消息. |
| TopicRequestor | JMS 提供TopicRequestor 类简化消息的收发过程.TopicRequestor 的构造函数有两个参数:TopicSession 和topic.TopicRequestor 通过创建一个临时主题来完成最终的发布和接收消息请求. |
| 可靠性(Reliability) | 当所有的消息必须被接收,则用持久订阅模式.当丢失消息能够被容忍,则用非持久订阅模式. |
综上所述,两者的API接口已经详细的写了出来,作为一个Java合格的开发者,即使不背会这些,也需要理解透彻记住.接着可以看看两种方式的对比:
3.JMS规范里的两种message传输方式Topic和Queue,两者的对比如下表:
| topic | Queue | |
| 概要 | Pub-Sub(发布/订阅) | PTP(点对点) |
| 有无状态 | topic数据默认是无状态的. | Queue数据是要实际介质保存的,如保存到数据库. |
| 完整性保障 | 并不保证publisher发布的每条数据,Subscriber都能接受到. | Queue保证每条数据都能被receiver接收. |
| 消息是否会丢失 | 一般来说publisher发布消息到某一个topic时,只有正在监听该topic地址的sub能够接收到消息;如果没有sub在监听,该topic就丢失了. | Sender发送消息到目标Queue,receiver可以异步接收这个Queue上的消息.Queue上的消息如果暂时没有receiver来取,也不会丢失. |
| 消息发布接收策略 | 一对多的消息发布接收策略,监听同一个topic地址的多个sub都能收到publisher发送的消息.Sub接收完通知服务器. | 一对一的消息发布接收策略,一个sender发送的消息,只能有一个receiver接收.receiver接收完后,通知服务器已接收,服务器对queue里的消息采取删除或其他操作. |
OK,here it is.Over.继续第三章.
JMS开发(二):深入PTP,Pub-Sub两种模式的更多相关文章
- 怎样在Android开发中FPS游戏实现的两种方式比较
怎样在Android开发中FPS游戏实现的两种方式比较 如何用Android平台开发FPS游戏,其实现过程有哪些方法,这些方法又有哪些不同的地方呢?首先让我们先了解下什么是FPS 英文名:FPS (F ...
- 消息队列:快速上手ActiveMQ消息队列的JMS方式使用(两种模式:Topic和Queue的消息推送和订阅)
1.实现功能 希望使用一套API,实现两种模式下的消息发送和接收功能,方便业务程序调用 1.发送Topic 2.发送Queue 3.接收Topic 4.接收Queue 2.接口设计 根据功能设计公共调 ...
- JSP中两种模式的总结
运用JSP/Servlet实现的Web动态交互,主要采用: 模式一:JSP+JavaBean 链接:http://wxmimperio.coding.io/?p=155 模式二;JSP+Servlet ...
- 【转】Reactor与Proactor两种模式区别
转自:http://www.cnblogs.com/cbscan/articles/2107494.html 两种IO多路复用方案:Reactor and Proactor 一般情况下,I/O 复用机 ...
- ACE_linux:Reactor与Proactor两种模式的区别
一.概念: Reactor与Proactor两种模式的区别.这里我们只关注read操作,因为write操作也是差不多的.下面是Reactor的做法: 某个事件处理器宣称它对某个socket上的读事件很 ...
- Doctype 严格模式与混杂模式-如何触发这两种模式,区分它们有何意义?
Doctype:(Document Type)文档类型,它位于文档中最前面的位置,处于标签之前.如果你想制作符合标准的页面,一个必不可少的关键组成部分就是DOCTYPE的声明.确定了正确的Doctyp ...
- Android Studio的两种模式及签名配置
我们使用Android Studio 运行我们的app,无非两种模式:debug和release模式. debug模式 debug模式使用一个默认的debug.keystore进行签名. 这个默认签名 ...
- 【Spark篇】---SparkStreaming+Kafka的两种模式receiver模式和Direct模式
一.前述 SparkStreamin是流式问题的解决的代表,一般结合kafka使用,所以本文着重讲解sparkStreaming+kafka两种模式. 二.具体 1.Receiver模式 原理图 ...
- Spark On Yarn的两种模式yarn-cluster和yarn-client深度剖析
Spark On Yarn的优势 每个Spark executor作为一个YARN容器(container)运行.Spark可以使得多个Tasks在同一个容器(container)里面运行 1. Sp ...
随机推荐
- 简单实现WPF界面控件换肤效果
效果如下如图:选择皮肤颜色 1.首先新建一个如图界面: 选择匹夫下拉框Xaml代码如下:三种颜色选项,并触发SelectionChanged事件 <ComboBox Height="2 ...
- bzoj1185
一遇到数学题和计算几何题我就要调半天…… 玛雅,我真是太弱了…… 基本思路很简单,先上凸包,然后矩形与凸包一边重合,然后旋转卡壳即可 然而我没怎么写过计算几何题,一开始写的各种囧,后来看了hzwer的 ...
- UVA 1151 Buy or Build (MST最小生成树,kruscal,变形)
题意: 要使n个点之间能够互通,要使两点直接互通需要耗费它们之间的欧几里得距离的平方大小的花费,这说明每两个点都可以使其互通.接着有q个套餐可以选,一旦选了这些套餐,他们所包含的点自动就连起来了,所需 ...
- LeetCode Reverse Linked List (反置链表)
题意: 将单恋表反转. 思路: 两种方法:迭代和递归. 递归 /** * Definition for singly-linked list. * struct ListNode { * int va ...
- MYSQL设计方案
Scale Out:横向扩展,增加处理节点提高整体处理能力Scale Up:纵向扩展,通过提升单个节点的处理能力达到提升整体处理能力的目的 ReplicationMySQL的replication是异 ...
- AFNetworking 2.0 来了
转:http://yangfei.me/blog/afnetworking-2-came/ 前几天 Mattt 发布了 AFNetworking 2.0,我的一个最大感慨就是,他怎么那么高产? 关于 ...
- SQL2012远程连接到SQL2008时的问题:已成功与服务器建立连接,但在登陆过程中发生错误。
服务器装的是2008,我机上装的是2012,结果一远程连接马上报错而且2012直接crash了.后来找到这位兄弟的帖子,http://www.cnblogs.com/liuguozhu2015/p/3 ...
- hdu 1024(最大和连续子序列增强版)
题意:最大和连续子序列的增强版,要求从一序列中取出若干段,这些段之间不能交叉,使得和最大并输出. 分析:用dp[i][j]表示前j个数取出i段得到的最大值,那么状态转移方程为dp[i][j]=max( ...
- FTP文件上传与下载
实现FTP文件上传与下载可以通过以下两种种方式实现(不知道还有没有其他方式),分别为:1.通过JDK自带的API实现:2.通过Apache提供的API是实现. 第一种方式:使用jdk中的ftpClie ...
- Jin Ge Jin Qu hao
题意: n首歌和一首经典歌已知其长度,一首歌开始唱必须唱完,现在已知剩余时间,求最多能唱歌的个数并保证唱歌时间总长最大 分析: 留最后一个时间唱经典,然后对剩下的时间用背包求出最大个数,并求出总长最大 ...