1. 消息属性类型:
a. 应用程序特定的属性,
b. JMS定义的属性,
c. 提供者特定的属性。
应用程序属性由应用程序开发者定义并应用到Message对象上,JMS扩展和提供者特定的属性大多是由JMS提供者自动添加的附加消息头。
a. 应用程序特定的属性:
其在消息传送之前进行设置,并不存在预先定义的应用程序属性,开发者可以自由定义能够满足他们需要的任何属性。 eg: 添加特定的属性,该属性标识正在发送消息的用户:
TextMessage message = pubSession.createTextMessage(); message.setText(text); message.setStringProperty("uname",uname); // 也可用于根据发布者身份对消息进行过滤。 publisher.publish(message);
同样,在Message接口中定义了关于属性的这些方法, 比如:boolean,byte,short,int,long,float,double 或 String类型。 而该接口为每种类型的属性值都提供了取值函数或赋值函数的方法。 eg:
public int getIntProperty(String arg0) throws JMSException ; public void setIntProperty(String arg0, int arg1) throws JMSException;
一旦一条消息发布或发送以后,它就变成了只读属性,消费者或生产者都无法修改它的属性。否则将抛出异常。不过通过调用clearProperties()方法后,就可以修改消息的属性,该方法将删除一条消息的所有属性,以便能够添加进新的属性,
Message接口中的getPropertyNames()方法可以用于获取该消息所有属性的名称枚举,而这些名称就可供属性取值函数方法使用,以获取属性值, eg:
public void onMessage(Message message) throws JMSException{ Enumeration propertyNames = message.getPropertyNames(); while(propertyNames.hasMoreElements() ){ String name = (String) propertyNames.nextElement(); Object value = message.getObjectProperty(name); } }
b. JMS定义的属性:
JMS定义的属性具有和应用程序属性相同的特性,除了前者大多数在消息发送时由JMS提供者来设置外。JMS定义的属性可以作为可选的JMS消息头。下面是JMS定义的9个属性:
JMSXUserID:
提供者在发送消息时自动设置的String值。可为客户端分配一个用户ID,(与该属性有关的值)。
JMSAppID:
提供者在发送消息时自动设置的String值。可为特定的JMS应用陈旭分配一个标识符,他是使用同一组目的地通信的一组消费者和订阅者。
JMSXProducerTXID 与 JMSXConsumerTXID:
前者由提供者在发送消息时设置, 后者由提供者在接收消息时设置。,系统中的每一个事务都有一个唯一的身份,它可以使用这些属性从生产者或消费者获得。
JMSRcvTimestamp:
接收消息时自动这只的原始类型long值,它表示消费者接受消息的UTC。即国际协调时间。
JMSXDeliveryCount:
接收消息时自动设置的int值。如果消费者没有明确地确认一条消息,该消息就可能会重新传送,这个属性保存了消息服务器视图想该特定消费者传送消息的总次数。
JMSXState:
JMS提供者自动设置的int值。而对消费者或生产者不可用。
接收消息时分配的JMS定义的属性,(JMSXConsumerTXID, JMSXRcvTimestamp, JMSXDeliveryCount) 对消息生产者不可用,它只对消费者可用。
两个组属性:
JMSXGroupID:
这个属性是JMS客户端在发送消息之前设置的String值。它是该消息所属组的身份标识。
JMSXGroupSeq:
是JMS客户端在发送消息之前设置的原始int类型。它是该消息在消息组内的序列号。
c. 提供者特定的属性:
每个JMS提供者都可以定义一组任何类型的私有属性,这些属性可以由客户端或提供者自动设置。