除了这里定义的头字段外,Message接口有一个内置的功能,这个功能支持属性值。这个功能为消息增加可选头字段提供了一种机制。属性可以让客户端通过消息选择器(参见章节3.8“消息选择”)来让JMS提供商根据应用特有的规则来选择消息。

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.5.4 属性值转换

属性支持下述的转换表。打标记的情况必须支持。没有打标记的情况必须抛出MessageFormatException。如果数值的valueOf方法认为传入的String不是有效的数值,那么 String到数值的转换必须抛出java.lang.NumberFormatException。企图读取一个null值作为java原始类型必须看作是调用原始类型的valueOf(String)转换方法来转换null值。设置为行总的类型,读作列中的类型。

3.5.5 属性值作为对象

除了特定类型的属性有set/get方法外,JMS提供了setObjectProperty/getObjectProperty方法。这两个方法支持设置使用对象化的原始类型的属性。它们用于在运行时来决定属性类型而不是在编译时决定。它们支持同样的属性值转换。

setObjectProperty方法接受Boolean,Byte,Short,Integer,Long,Float,Double和String的值。企图使用其他的类必须抛出MessageFormatException。

getObjectProperty方法只返回null,Boolean,Byte,Short,Integer,Long,Float,Double和String的值。如果指定的属性名不存在则返回null。

3.5.6 属性迭代

没有定义属性值的排序。为了通过消息的属性值来迭代,那么使用getPropertyNames来取得所有的属性名,然后使用不同的属性get方法来取出它们的值。

方法getPropertyNames没有返回JMS标准头字段的名字。

3.5.7 清除消息属性的值

通过clearProperties方法来删除消息的属性。这会使消息有一个空的属性集。然后可以创建和读取新的属性条目。清除消息的属性条目不会清理消息体的值。

一旦私有属性条目被添加到消息中,则JMS没有提供删除它的途径。

3.5.8 不存在的属性

按名字获取一个还没有被赋值的属性值则按照属性被赋了null值来处理。

3.5.9 JMS定义的属性

JMS保留了“JMSX”作为JMS属性名的前缀。这些属性都在表3‐3中。新的JMS定义的属性可能在后续版本中增加。除非说明否则支持这些属性是可选的。ConnectionMetaData.getJMSXPropertyNames()方法返回所有连接支持的JMSX属性的名字。无论连接是否支持JMSX属性,它们都可以在消息选择器中使用。如果消息中没有这些属性,那么它们与其他缺席属性一样看待。

在特定消息中,存在JMS定义的属性,它们是由JMS提供商根据如何控制属性的使用来设置的。根据管理或其它规则,可以在某些消息中包含它们在其他消息中忽略它们。

表 3.2. JMS 定义的属性

名字类型设置者用法
JMSXUserIDString发送时提供商设置

发送消息的用户标识

JMSXAppIDString发送时提供商设置发送消息的应用标识
JMSXDeliveryCountint发送时提供商设置转发消息重试次数;第一次是1,第二次是2,…
JMSXGroupIDString客户端消息所在消息组的标识
JMSXGroupSeqint客户端组内消息的序号;第一个消息是1,第二个是2,…
JMSXProducerTXIDString发送时提供商设置

产生消息的事务的事务标识

JMSXConsumerTXIDString接收时提供商设置

消费消息的事务的事务标识

JMSXRcvTimestamplong提供商JMS 转发消息到消费者的时间
JMSXStateint提供商

假定存在一个消息仓库,它存储了每个消息的单独拷贝,且这些消息从原始消息被发送时开始。每个拷贝的状态有:1 (等待),2(准备),3(到期)或4(保留)。 由于状态与生产者和 消费者无关,所以它 不是由它们来提供。 它只和在仓库中查找 消息相关,因此JMS没有提供这种API。

3.5.10 提供商专有的属性

JMS为提供商专有的属性保留了“JMS_”属性名前缀。每个提供商定义了他们自己的值。JMS提供商使用这个机制来让JMS客户端可以获取它的所有消息服务。

提供商专有属性的目的是为提供商本地客户端提供特殊功能。他们不应当用于JMS。

3.6 消息确认

当客户端指定JMS消费者的消息要显式地被确认时,所有的JMS消息使用acknowledge方法来确认消息。

如果客户端使用自动确认,那么忽略对确认方法的调用。

3.7 Message接口

Message接口是所有JMS消息的根接口。它定义了JMS消息头字段、属性工具和acknowledge方法。