下面的子章节描述了所有的消息头字段。消息的头被完整地转发到所有的JMS客户端。JMS没有定义那些转发到非JMS 客户端的头字段。

3.4.1 JMSDestination

JMSDestination包含了消息被发往的目的地。当消息被发送时,忽略这个字段。在发送完成后,这个字段容纳由发送方法指定的目的地对象。当消息被接收时,它的目的地的值必须等于发送时赋给的值。

3.4.2 JMSDeliveryMode

JMSDeliveryMode包含了消息发送时指定的转发模式。当消息被发送时,这个字段被忽略。在完成发送后,它包含了由发送方法指定的转发模式。

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可以容纳下列的类型值:

• 提供商专有的消息ID

应用专有的String

提供商本地的byte[]值

由于每个由JMS提供商发送的消息都被赋予了一个消息ID值,所以通过消息ID来链接消息是非常方便的。所有的消息ID 值都必须以“ID:”作为前缀。

在某些情况下,应用(有几个客户端组成)需要使用应用专有的值来链接消息。例如,应用可以使用JMSCorrelationID 来容纳一个引用一些外部信息的值。应用专有的值不必以“ID:”为前缀;这是提供商生成消息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,那么它告诉消费应用这个消息可能已经被转发过,应用应当引起注意以免重复处理。这个头字段对发送没有意义,不会被发送方法赋值。

3.4.8 JMSType

JMSType包含了由客户端在发送消息时提供的消息类型标识。

某些JMS提供商使用消息存储池,这个池包含了由应用发送的消息的定义。Type字段可以引用提供商池内的消息定义。

JMS没有定义标准的消息定义池,也没有定义定义的命名策略。

某些消息系统要求为每个应用消息创建消息类型定义并指定每个消息的类型。为了和这样的JMS 提供商一起工作,无论应用是否使用它JMS客户端都应当为JMSType赋值。这保证为那些需要这个字段的提供商提供正确的设置。

为了保证可移植性,JMS客户端应当使用抽象符合为JMSType赋值,以便它能在安装时被配置成当前提供商消息存储池中定义的值。如果使用字符串,对某些JMS 提供商来说他们可以不是有效的类型名。

3.4.9 JMSExpiration

当消息被发送时,它的到期时间是在发生方法中指定的存活时间和当前GMT值之和。在从发送方法返回时,消息的JMSExpiration 头字段包含这个到期的值。当消息被接收时,它的MSExpiration中的值就是发送时的值。

如果存活时间指定为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
JMSReplyToClient
JMSType Client
JMSRedelivered Provider

3.4.12重载消息头字段

JMS可以让管理员配置JMS来重载客户端特有的JMSDeliveryMode、JMSExpiration和JMSPriority的值。如果重载了,头字段的值必须是管理员指定的值。

JMS没有特别定义管理员如何重装这些头字段的值。没有要求支持JMS提供商支持这个管理选项。