按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 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 来容纳一个引用一些外部信