消息的属性就像可以分配给一条消息的附加消息头一样。它们允许开发者添加有关消息的不透明附加信息。它们还用于暴露消息选择器在消息过滤时使用的数据。Message接口为读取和写入属性提供了若干个取值函数和赋值函数方法。消息的属性值可以是String, boolean , byte,short, double, int ,long或float型。消息属性有3种基本类型:应用程序特定的属性,JMS定义的属性和提供者特定的属性。应用程序属性由应用程序开发者定义并应用到Message对象上; JMS扩展和提供者特定的属性大多是由JMS提供者自动添加的附加消息头。
应用程序特定的属性
由应用程序开发者定义的所有属性都可以作为一个应用程序特定的属性。应用程序属性在消息传送之前进行设置。并不存在预先定义的应用程序属性,开发者可以自由定义能够满足它们需要的任何属性。例如,在聊天示例中,可以添加一个特定的属性,该属性标识了正在发送消息的用户:
TextMessage message = pubSession.createTextMessage();
message.setText(text);
message.setStringProperty("username",username); //自定义属性
publisher.publish(message);
作为一个应用程序的特定属性,username一旦离开Chat应用程序就变得毫无意义;它专门用于应用程序根据发布者身份对消息进行过滤。
属性值可以是boolean,byte,short,int,long,float,double或String类型。javax.jms.Message接口为每种类型的属性值都提供了取值函数和赋值方法。如下:
public interface Message {
public String getStringProperty(String name) throws JMSException,MessageFormatException;
public void setStringProperty(String name,String value) throws JMSException,MessageNotWriteableException;
public int getIntProperty(String name) throws JMSException,MessageFormatException;
public void setIntProperty(String name,int value) throws JMSException,MessageNotWriteableException;
public boolean getBooleanProperty(String name) throws JMSException,MessageFormatException;
public void setBooleanProperty(String name,boolean value) throws JMSException,MessageNotWriteableException;
public double getDoubleProperty(String name) throws JMSException,MessageFormatException;
public void setDoubleProperty(String name) throws JMSException,MessageFormatException;
public float getFloatProperty (String name) throws JMSException,MessageFormatExdeption;
public void setFloatProperty(String name,float value) throws JMSException,MessageNotWriteableException;
public byte getByteProperty(String name) throws JMSException,MessageFormatException;
public void setByteProperty(String name) throws JMSException,MessageNotWriteableException;
public long getLongProperty(String name) throws JMSException,MessageNotWriteableException;
public void setLongProperty(String name,long value) throws JMSException,MessageNotWriteableException;
public short getShortProperty(String name) throws JMSException,MessageFormatException;
public void setShortProperty(String name,short value) throws JMSException,MessageNotWriteableException;
public Object getObjectProperty(String name) throws JMSException,MessageNotWriteableException;
public void setObjectProperty(String name,Object value) throws JMSException,MessageNotWriteableException;
public void clearProperties() throws JMSException;
public Enumeration getPropertyNames() throws JMSException;
public boolean propertyExists(String name) throws JMSException;
......
}
对象属性方法(setObjectProperty()和getObjectProperty())要求对象包装器的数据类型为:允许使用的原始数据类型(java.lang.Integer,java.lang.Double等)和String类型。这些方法不能与其他类型的Java对象(比如传输对象或业务对象等)一起使用。
一旦一条消息发布或发送以后,它就变成了只读属性;消费者或生产者都无法修改它的属性。如果消费者试图设置某个属性,该方法就会抛出一个javax.jms.MessageNotWriteableException。不过,通过调用clearProperties()方法,就可以修改消息的属性,该方法将删除一条消息的所有属性,以便能够添加进新的属性。
Message接口中的getPropertyNames()方法可以用于获取该消息所有属性的名称枚举(Enumeration)。接下来,这些名称就可供属性取值函数方法使用,以获取属性值。例如:
public void onMessage(Message message) {
Enumeration propertyNames = message.getPropertyNames();
while(propertyNames.hasMoreElements()) {
String name = (String) propertyNames.nextElement();
Object value = getObjectProperty(name);
System.out.println("\nname+" = " + value);
}
}
JMS定义的属性
JMS定义的属性具有和应用程序属性相同的特性,除了前者大多数在消息发送时由JMS提供者来设置之外。JMS定义的属性可以作为可选的JMS消息头;下面是JMS定义的9个属性清单:
JMSXUserID
JMSXAppID
JMSXProducerTXID
JMSXConsumerTXID
JMSXRcvTimestamp
JMSXDeliveryCount
JMSXState
JMSXGroupID
JMSXGroupSeq
在这份清单中,只有JMSXGroupID和JMSXGroupSeq需要所有JMS提供者的支持。这些可选属性用于聚合消息。请注意:在Message接口中,您将无法找到对应的setJMSX<PROPERTY>()和getJMSX<PROPERTY>()方法定义;在使用这些方法时,必须使用和应用程序特定属性相同的方法来设置它们:
message.setStringProperty("JMSXGroupID","ERF-001");
message.setIntProperty("JMSXGroupSeq",3);
提供者特定的属性
每个JMS提供者都可以定义一组私有属性,这些属性可以由客户端或提供者自动设置。提供者特定的属性必须以前缀JMS开头,后面紧接着是属性名称(JMS<vendor-property-name>)。提供者特定的属性,其作用就是支持厂商的私有特性。