2.4.7 JMS领域
就像之前提到的,JMS是团队成果,这个团队就包括了消息传送实现的提供商。JMS定义了两种类型的消息传送,这是由现有的消息传送实现决定的。这两种风格(也叫做领域domains)是point-to-point及publish/subscribe。大多数的MOMs已经支持两种类型的消息传送风格,所以JMS API也必须同时支持它们。让我们详细看下这两种类型的消息传送。
点对点领域
点对点(PTP)消息传送使用的目标是队列。通过使用队列,消息可以被异步或同步地发送和接收。每一条到达队列的消息将会被投递到单独一个消费者一次,并且只有一次。这就好像两个人之间的邮件发送。消费者可以通过MessageConsumer.receive()方法同步地接收消息或使用MessageConsumer.setMessageListener()方法注册一个MessageListener实现来异步地接收消息。队列保存所有的消息直到它们被投递出去或过期。
如图2.6所示,多个消费者可以注册在一个队列上,但一条消息只有一个消费者会接收到。然后消费者要决定是否应答这条消息。注意,图2.6所示的消息是从一个生产者出来的并且只投递给一个消费者,而不是所有消费者。就像前面提到的,JMS提供者保证消息一次并且只有一次投递给下一个准备好的消费者。JMS提供者是对所有已注册的消费者循环发送消息的。
发布订阅领域
发布订阅模式的消息使用主题(topics)作为目标。发布者发送消息到主题,订阅者从主题接收消息。发送到主题的消息会自动发给所有的订阅者。这个消息传送领域就像预制一个邮件列表,所有邮件列表上的用户都会受到消息。图2.7描述了这种情况。
就像PTP消息传送一样,订阅者可以通过MessageConsumer.receive()方法同步地接收消息或使用MessageConsumer.setMessageListener()方法注册一个MessageListener实现来异步地接收消息。主题并不保存消息,除非显式地让它这样做。这个可以通过使用持久订阅(durable subscription)来实现。使用持久订阅,如果一个订阅者与JMS提供者连接断开,JMS提供者有责任为该订阅者保存消息。重新连上后,订阅者将收到所有的未过期的消息。持久订阅允许订阅者断开连接而不会丢失任何消息。
持久订阅(durability)和消息持久化(persistence)的区别
持久订阅和消息持久化是JMS经常会混淆的两个概念。虽然它们很类似,但是还是有一些明显的不同,并且它们的用途也不一样。消息持久订阅只在发布/订阅领域有效。当客户端连接到一个主题上,它们可以选择使用持久或非持久订阅。考虑这两种情况的区别。
- 持久订阅----一个持久订阅的时间是无限的。客户端注册到主题上,并且告诉JMS提供者当订阅者断开连接时保持订阅状态。如果一个订阅者的连接断开了,JMS提供者将保持所有的消息直到订阅者重新连上或者订阅者取消订阅。
- 非持久订阅----一个非持久订阅是有限的。客户端注册到主题上并且告诉JMS提供者当连接断开是不用保持订阅状态。如果一个订阅者断开连接,JMS提供者在断开的这段时间里不会保存任何消息。
消息持久化是独立于消息领域的。消息持久化是一种服务质量属性,它用来指出JMS应用处理消息投递失败时的能力。就像之前提到的,这个值是通过消息生产者setDeliveryMode方法来设置的,这个方法的输入参数是JMSDeliveryMode类的变量PERSISTENT或NON-PERSISTENT。
JMS应用的请求/回复传送机制
虽然JMS规范没有把请求/回复(request/reply)消息传送作为一种正式的消息领域来定义。当它提供了一些消息头部和许多有用的类来处理请求/回复消息传送。请求/回复消息传送是一种异步的会话模式,可以在PTP或pub/sub领域使用。这种模式会用到JMSReplyTo和JMSCorrelationID消息头部及临时的消息目标。JMSReplyTo指定一个回复消息投递的目标,JMSCorrelationID指定回复消息对应的请求的JMSMessageID。这些头部用来关联回复消息和它(们)的请求消息。临时的目标只能在连接持续时间里有效并且只能被创建它的连接使用。这些限制条件使得临时目标对于请求/回复模式很有用。
QueueRequestor和TopicRequestor是两个处理请求/回复模式的有用的类。这些类提供一个request()方法发送一条请求消息并且通过临时目标等待回复。一般地,是一个请求预期会得到一个回复。图2.8显示了一个请求,一个回复的流程。
图2.8通过两个终端描绘了基本的请求/回复消息传送类型。这个过程是使用了JMSReplyTo消息头部和一个临时目标。接收者通过临时目标发送回复消息,请求者则通过它接收消息。QueueRequestor和TopicRequestor这两个类可以用来处理基本的请求/回复模式,但不能用来处理复杂的情况,比如一个请求对应多个接收者的多个回复。这种需求要求你自己开发自定义的JMS客户端。
2.4.8 管理对象(Administered objects)
管理对象包含JMS提供者特定的配置信息,它由JMS管理者创建。因此,管理对象是被JMS客户端使用的。它们用来隐藏提供者特定的细节并且抽象JMS提供者的管理任务。管理对象可以通过JNDI访问,但不是必须。最常见的情况是JMS提供者寄居在Java EE容器里。JMS规范提供两种类型的管理对象:连接工厂(ConnectionFactory)和目标(Destination)。
连接工厂
JMS客户端使用连接工厂来创建到JMS提供者的连接。连接一般就是一个客户端与JMS提供者之间的TCP连接,所以连接的负载是很大的。使用一个连接池是比较合适的。一个到JMS提供者的连接就像一个到关系数据库的JDBC连接(JDBC连接是客户端用来和数据库交互的)。客户端使用JMS连接来创建java.jms.Session对象,该对象代表与JMS提供者的一个交互。
目标
目标封装了提供者特定的地址,这地址是用来发送和消费信息的。虽然目标是使用session对象创建的,它们的生存时间是和创建session的连接一致。
临时目标对于一个连接是唯一的。它们的生命周期和创建它们的连接一致,并且只有创建它们的连接才能为该目标创建消费者。就像前面提到的,临时目标是用在请求/回复消息传送中的。
- 大小: 45.5 KB
- 大小: 54 KB
- 大小: 26.3 KB
分享到:
相关推荐
JMS规范v1.1的官方原版,大家学习ActiveMQ的时候可以进行参考。详细介绍了包括连接、session、生产者、消费者、topic、queue等概念。深入学习的必备手册。
jms规范2.0版本,包含中英文文档和java doc
JMS1.1规范(中文) 免费下载 找找找了半天才找到
JMS规范PDF
JMS规范和简明教程JMS规范和简明教程JMS规范和简明教程JMS规范和简明教程JMS规范和简明教程JMS规范和简明教程
作者:卫建军 Java 是当前 IT 领域中比较流行的技术之一。J2EE 是当前比较流行的企业级应用架构。 本人一直致力于 J2EE 架构的学习和研究,但是总是对英文文档...持久化规范》和《JMS1.1 规范》。希望对大家有所帮助。
JMS规范教程,介绍jms的入门,配置,及其实现
JMS规范1.1,本规范描述了JMS的目标和功能。 JMS给java程序员提供了一种通用的方式来创建、发送、接收和查看企业消息系统 消息。
JMS规范,如果想深入了解JMS的,可以看一下
JMS1.1规范(中文版) 虽然不是什么好好的资源,希望对初心者有一点帮助。
JMS规范培训教程 SUN MQ
JMS 规范培训教程 手册 教程 指南 pdf
JMS规范教程,中文版。本文内容译自 SUN JMS1.1 规范的主要部分及 SUN MQ 参考资料整理制作而成,可供 JMS 初学者入门。
JMS绑定规范JMS绑定规范JMS绑定规范JMS绑定规范JMS绑定规范JMS绑定规范JMS绑定规范JMS绑定规范
JMS规范教程,学习JMS的朋友可以好好看看
JMS规范培训教程以及JMS源代码,希望对大家有所帮助
activemq中间件视频 jms
JMS规范培训教程,帮助了角JMS
JMS 为 Java 程序提供了一种创建、发送、接收和读取企业消息系统中消息的通用方法。 企业消息产品(有时也被称为面向消息的中间件MOMMessageOriented Middleware),正成为一种用来整合公司内部操作的重要组件。它们...