按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
有两个原因要限制并发访问Session 。第一个,Session 是支持事务的JMS 实体。实现多
线程的事务是非常困难的。第二,Session 支持异步的消费消息。重要的是JMS 不要求用于
消费异步消息的客户端代码有处理多个并发的消息的能力。另外,如果Session 被设置有多
个异步的消费者,那么不强迫客户端处理这些并发执行的分散的消费者。这些约束使得通常
的客户端更加容易地使用JMS 。更专业的客户端可以通过使用多个会话来获得他们期望的并
非性。
2。9 触发式客户端
某些客户端被设计成被周期性的唤醒来处理等待它们的消息。一个基于消息的应用触发
机制常和客户端的风格一起使用。触发器通常是等待消息的起点,等等。
JMS 没有提供触发客户端执行的机制。某些提供商可以通过它们的管理工具提供这样的
触发机制。
2。10 请求/ 回复
JMS 提供了 JMSReplyTo 消息头字段来指定回复的消息应当被发送到的目的地。回复的
JMSCorrelationID 头字段可以被用于引用原始的请求。参见 3。4 章节“消息头字段”了解详
细信息。
另外,JMS 提供了创建临时队列和主题的功能,它可以用作回复的唯一目的地。
企业消息产品支持许多请求/ 回复风格,从简单的“一个消息请求产生一个消息回复”
到“一个消息请求产生一串回复,回复消息来自多个应答者”。JMS 不仅架构了一个特定的
请求/ 回复抽象,而且提供了基本的工具,许多企业消息产品可以基于它来构建。
为了方便,JMS 为PTP 和Pub/Sub 域定义了请求/ 响应帮助类(这些类用JMS 实现),它
实现了请求/ 回复的基本形式。JMS 提供商和客户端可以提供更加专业的实现。
3 JMS 消息模型
3。1 背景
企业消息产品把消息看作是轻量级的实体,它由消息头和消息体组成。消息头包含了用
于消息路由和标识的字段;消息体包含了被发送的应用数据。
通常情况下,消息的定义随产品的不同有很大的差别。主要的差别是消息头的内容和语
义。某些产品使用自描述的规范的消息数据编码;其他的可能将数据认为是完全不透明的。
某些产品为能被用于标识和解释消息内容的消息描述提供了存储池;其他的就没有。
对JMS 来讲捕获偶尔冲突的消息模型组合的范围是非常困难的。
16 / 66
…………………………………………………………Page 17……………………………………………………………
3。2 目标
JMS 消息模型有下列目标:
z 提供一个单一的统一的消息API 。
z 提供一个API ,它能创建匹配现存的非JMS 应用使用的格式的消息。
z 支持异构应用的开发,异构应用涵盖操作系统、机器架构和计算机语言。
z 支持包含java 对象的消息。
z 支持包含可扩展标签语言(XML )页面的消息(参见http://w3。org/XML)。(译
者注:就是消息是XML )
3。3 JMS 消息
JMS 消息由以下部分组成:
z 消息头——所有的消息都支持相同的头字段集。头字段包含了客户端和提供商都要
使用的用于标识和路由消息的值。
z 属性——除了标准的头字段外,消息提供了一个内置的功能来向消息增加可选的头
字段。
应用专有属性—为消息增加应用专有的头字段提供的机制。
标准属性—JMS 定义的一些标准属性,它们相当于可选的头字段。
提供商专有属性—在集成JMS 客户端和JMS 提供商本地客户端时可能会用到
提供商专有的属性。JMS 为这些属性定义了命名规范。
z 消息体——JMS 定义了几个消息体类型,这些类型覆盖了大部分当前使用的消息风
格。
3。4 消息头字段
下面的子章节描述了所有的消息头字段。消息的头被完整地转发到所有的JMS 客户端。
JMS 没有定义那些转发到非JMS 客户端的头字段。
3。4。1 JMSDestination
JMSDestination 包含了消息被发往的目的地。
当消息被发送时,忽略这个字段。在发送完成后,这个字段容纳由发送方法指定的目的
地对象。
当消息被接收时,它的目的地的值必须等于发送时赋给的值。
3。4。2 JMSDeliveryMode
JMSDeliveryMode 包含了消息发送时指定的转发模式。
当消息被发送时,这个字段被忽略。在完成发送后,它包含了由发送方法指定的转发模
式。
17 / 66
…………………………………………………………Page 18……………………………………………………………
参见4。7 章节“消息转发模式”了解更详细的信息。
3。4。3 JMSMessageID
JMSMessageID 包含了一个用于唯一标识由提供商发送的每个消息。
当消息被发送时,JMSMessageID 被忽略。当发送方法返回时,这个字段包含了一个提
供商赋予的值。
JMSMessageID 是一个 String 值,它用于在历史存储池中唯一标识消息的主键。唯一性
的确切范围由提供商定义。它至少应当覆盖一个提供商安装的所有的消息,这里一个安装被
连接到一系列消息路由器。
所有的 JMSMessageID 值必须以前缀“ID:”开始,没有要求跨不同提供商的消息ID 值
的唯一性。
由于消息ID 需要花费时间来创建并增加了消息的长度,因此如果消息已经被给了一个
暗示说英语不使用消息ID,那么JMS 提供商可以优化过长的消息。JMSMessageProducer 提
供取消消息ID 的暗示。当客户端设置消息生产者不使用消息ID 时,它就是说它生产的消息
不依赖消息 ID 的值。如果JMS 提供商接受这个暗示,那么这些消息的消息 ID 必须设置为
null;如果提供商不接受这个暗示,那么必须为消息ID 设置一个唯一的值。
3。4。4 JMSTimestamp
JMSTimestamp 包含了消息被发送的时间。但不是消息被真正转发的时间,因为真正的
发送可能由于事务或其他的客户端消息排队而比较晚。
当一个消息被发送时,JMSTimestamp 被忽略。当发生方法返回时,这个字段包含了调
用和返回之间的某个时间值。它的格式是通常的java 毫秒时间值。
由于时间戳需要花时间来创建,并增加了消息的长度,如果应用暗示不使用时间戳,那
么某些JMS 提供商可以优化消息的过载。JMS MessageProducer 可以暗示不使用时间戳。当
客户端设置生产者不使用时间戳,那么它就是说它生产的消息不依赖于时间戳的值。如果
JMS 提供商接受了这种暗示,那么这些消息的时间戳必须被设置成0 ;如果提供商不接受这
种暗示,则必须设置时间戳的值。
3。4。5 JMSCorrelationID
客户端可以使用JMSCorrelationID 来链接消息。典型的用法就是将响应消息和请求消息
链接起来。
JMSCorrelationID 可以容纳下列的类型值:
z 提供商专有的消息ID
z 应用专有的String
z 提供商本地的byte''值
由于每个由JMS 提供商发送的消息都被赋予了一个消息ID 值,所以通过消息ID 来链接
消息是非常方便的。所有的消息ID 值都必须以“ID:”作为前缀。
在某些情况下,应用(有几个客户端组成)需要使用应用专有的值来链接消息。例如,
应用可以使用JMSCorrelationID 来容纳一个引用一些外部信息的值。应用专有的值不必以“ID:”
18 / 66
…………………………………………………………Page 19……………………………………………………………
为前缀;这是提供商生成消息ID 值时的保留字符。
如果提供商支持关联 ID 的本地概念(native ),那么 JMS 客户端可能需要给
JMSCorrelationID 赋特定的值来匹配非JMS 客户端期望的值。Byte''值就是用于这个目的。没
有本地关联 ID 的 JMS 提供商不要求支持 byte''值(注:setJMSCorrelationIDAsBytes()和
getJMSCorrelationIDAsBytes() 可以抛出 java。lang。UnsupportedOperationException )。为
JMSCorrelationID 使用byte''值是不可移植的。
3。4。6 JMSReplyTo
当消息被发送时,JMSReplyTo 包含一个由客户支持的目的地。它是回复消息应当被发送
到的目的地。
JMSReplyTo 为 null 的消息可能是某个事件的通知消息或它们仅仅是发送者认为是有兴
趣的数据。
JMSReplyTo 有值得消息通常是期望响应的消息。响应是可选的;由客户端来决定。
3。4。7 JMSRedelivered
如果客户端收到一个设置了JMSRedelivered 指示的消息,那么很可能但不能保证这个消
息被转发过但没有确认。通常情况下,提供商必须设置JMSRedelivered ,无论它是否正在重
新转发一个消息。如果JMSRedelivered 设置为true ,那么它告诉消费应用这个消息可能已经
被转发过,应用应当引起注意以免重复处理。参加4。4。11 章节“消息确认”了解更详细的信
息。
这个头字段对发送没有意义,不会被发送方法赋值。
3。4。8 JMSType
JMSType 包含了由客户端在发送消息时提供的消息类型标识。
某些JMS 提供商使用消息存储池,这个池包含了由应用发送的消息的定义。Type 字段
可以引用提供商池内的消息定义。
JMS 没有定义标准的消息定义池,也没有定义定义的命名策略。
某些消息系统要求为每个应用消息创建消息类型定义并指定每个消息的类型。为了和这
样的JMS 提供商一起工作,无论应用是否使用它JMS 客户端都应当为JMSType 赋值。这保
证为那些需要这个字段的提供商提供正确的设置。
为了保证可移植性,JMS 客户端应当使用抽象符合为JMSType 赋值,以便它能在安装时
被配置