友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
JMS简明教程(PDF格式)-第4部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
图2�1 JMS 对象间关系概览
在这个文档中使用的术语“消费”是指通过JMS 客户端接收消息;也就是说,一个JMS
提供商已经收到一个消息并将它给了它的客户端。由于 JMS 支持同步和异步接收消息,因
14 / 66
…………………………………………………………Page 15……………………………………………………………
此术语“消费”在不需要区分它们的时候使用。
术语“生产”用作发送消息的最通用的术语。它指给予 JMS 提供商一个消息以转发到
一个目的地。
2。6 开发一个JMS 应用
广义的讲,一个JMS 应用是一个或多个交换消息的JMS 客户端。应用也涉及非JMS 客
户端;但是,这些非JMS 客户端使用JMS 提供商的本地API 而不是JMS 的API 。
一个JMS 应用可以被架构和部署为一个单元。在许多情况下,JMS 客户端是被逐渐增加
到线程的应用中的。
应用使用的消息定义可以来源于JMS ,或者他们可能已经由应用的非JMS 部分定义了。
2。6。1 开发一个JMS 客户端
典型的JMS 客户端执行下面的JMS 设置过程:
z 使用JNDI 来发现ConnectionFactory 对象。
z 使用JNDI 来发现一个或多个Desitination 对象。
z 使用ConnectionFactory 来创建一个具有消息转发约束的JMS Connection 。
z 使用Connection 来创建一个或多个JMS Session 。
z 使用Session 和Destination 来创建需要的MessageProducer 和MessageConsumer。
z 告诉Connection 开始转发消息。
此时,客户端有了生产和消费消息的基本的JMS 设置。
2。7 安全
JMS 没有提供控制或配置消息完整或消息私密的特性。
这期望由 JMS 提供商来提供。也期望由提供商专有的管理工具来配置这些服务。客户
端将得到正确的安全配置作为他们使用的被管理对象的一部分。
2。8 多线程
JMS 已经要求它的所有对象都支持并发誓要。由于支持并非访问通常会增加一些成本和
复杂性,所以 JMS 限制了那些很自然要被多线程客户端并发访问的对象的要求。其他的都
被设计成在一个时间只能被一个逻辑线程访问。
表2�2 支持并发使用的JMS 对象
JMS 对象 支持并非使用
Destination YES
ConnectionFactory YES
Connection YES
Session NO
MessageProducer NO
15 / 66
…………………………………………………………Page 16……………………………………………………………
MessageConsumer NO
JMS 定义了一些特殊的规则来限制Session 的并发使用。由于他们要求比在这里呈现的
更多的JMS 知识,所以他们将在后面描述。这里我们将描述他们必须遵守的基本原理。
有两个原因要限制并发访问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 赋值,以便它能在安装时
被配置成当前提供商消息存储池中定义的值。如果使用字符串,对某些 JMS 提供商来说他
们可以不是有效的类型名。
3。4。9 JMSExpiration
当消息被发送时,它的到期时间是在发生方法中指定的存活时间和当前GMT 值之和。
在从发送方法返回时,消息的 JMSExpiration 头字段包含这个到期的值。当消息被接收时,
它的JMSExpiration 中的值就是发送时的值。
19 / 66
…………………………………………………………Page 20……………………………………………………………
如果存活时间指定为0,那么表明消息没有到期时间。
当当前GMT 已经晚于未转发消息的到期时间时,应当销毁这个消息。JMS 没有定义消
息到期时的通知。
3。4。10 JMSPriority
JMSPriority 头字段包含了消息的优先级。
当消息被发送时,这个字段被忽略。在完成发送后,它容纳了由发送方法指定的优先级
值。
JMS 定义了十个优先级值,0 是最低的优先级,9 是最高的优先级。另外,客户端应当
将0�4 看作普通优先级,5�9 看作加急优先级。
JMS 没有要求提供商严格地实现消息的优先级顺序;但是,它应当尽力在普通消息之前
转发加急消息。
3。4。11 如何设置消息头的值
表3�1 发送时设置消息头字段的值
头字段 设置者
JMSDestination Send Method
JMSDeliveryMode Send Method
JMSExpiration Send Method
JMSPriority Send Method
JMSMessageID Send Method
JMSTimestamp Client
JMSCorrelationID Client
JMSReplyTo Client
JMSType Client
JMSRedelivered Provider
3。4。12 重载消息头字段
JMS 可以让管理员配置 JMS 来重载客户端特有的 JMSDeliveryMode 、JMSExpiration 和
JMSPriority 的值。如果重载了,头字段的值必须是管理员指定的值。
JMS 没有特别定义管理员如何重装这些头字段的值。没有要求支持JMS 提供商支持这个
管理选项。
3。5 消息属性
除了这里定义的头字段外,Message 接口有一个内置的功能,这个功能支持属性值。这
个功能为消息增加可选头字段提供了一种机制。
属性可以让客户端通过消息选择器(参见章节 3。8 “消息选择”)来让JMS 提供商根据
20 / 66
…………………………………………………………Page 21……………………………………………………………
应用特有的规则来选择消息。
3。5。1 属性名
属性名必须遵循消息选择器标识的规则。参见章节3。8。1。1 “消息选择器语法”了解更详
细信息。
3。5。2 属性值
属性的值可以是boolean,byte,short,int,long,float ,double 和String 。
3。5。3 属性的使用
在发送消息之前设置属性值。当客户端接收到一个消息时,它的属性是只读模式。如果
客户端企图修改属性,那么抛出MessageNotWriteableException。
可以在消息体中保存一份属性值的副本,也可以不保存。尽管 JMS 没有定义属性哪些
作为属性或哪些不应当作为属性的策略,但应用开发者应当注意 JMS 提供商很可能在消息
体内处理数据的效率比处理在属性中的数据高。为了提高性能,应用应当只在需要客户化消
息头时才使用消息属性。客户化消息头的主要原因是为了支持客户化的消息选择。
参见章节3。8 “消息选择”来了解JMS 消息属性的详细信息。
3。5。4 属性值转换
属性支持下述的转换表。打标记的情况必须支持。没有打标记的情况必须抛出
MessageFormatException。如果数值的valueOf 方法认为传入的String 不是有效的数值,那么
String 到数值的转换必须抛出java。lang。NumberFormatException 。企图读取一个 null 值作为
java 原始类型必须看作是调用原始类型的valueOf(String)转换方法来转换null 值。
设置为行总的类型,读作列中的类型
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!