代码改变世界

activemq in action(3)剖析JMS消息(转)

2013-06-09 19:17  很大很老实  阅读(228)  评论(0编辑  收藏  举报

对于JMS来说,最重要的就是message.

Message有三个主要组成部件:标头、主体和属性
 
 
一、消息标头:
消息标头是消息的信封,包含为使消息到达目的地所需要的所有信息,可以直接控制其中一些字段的值,其它值则由JMS提供程序填写。
 
JMSDestination:
由Send方法设置。指定消息的目的地,由JMS提供程序填写
JMSDeliveryMode:
         由Send方法设置。提交消息的模式-持续或非持续。发送消息后JMS提供程序填写该字段。
JMSMessageID:
         Send方法设置。包含消息的唯一标识符。发送过程中由JMS提供程序填写
JMSTimeStamp:
         Send方法设置。记录消息被传递给send方法的时间。发送过程中由JMS提供程序填写
JMSCorrelationID:
         由客户端设置。包含用于将消息连接在一起的ID。客户端一般将其置为所引用消息的ID
JMSReplyTo:
         由客户端设置。响应消息的目的地,如果客户端期望得到响应消息,则填写该字段
JMSRedelivered:
         由JMS提供程序设置。指出该消息先前被发送过
JMSType:
         由客户端设置。包含由客户端提供的消息类型标识符。是否需要该字段,不同的提供程序有不同要求
JMSExpiration:
         Send方法设置。一个根据客户端提供的年龄计算出来的值,如果GMT比该过期值晚,则销毁消息
JMSPriority:
         Send方法设置。包含客户端在发送消息时所设置有限级值
 
二、消息属性
除了上面的属性,还可以自定义属性,以便进行消息的选择
一般通过setXXXProperty方法来定义消息属性,XXX取值为:Boolean、Byte、Double、Float、Int、Long、Object、Short及String。
每一属性均由字符串名字和相关的值组成
TextMessage msg = tsession.createTextMessage();
msg.setStringProperty(“CUSTOMER_NAME”,”MyCustomer”);
String customer = msg.getStringProperty(“CUSTOMER_NAME”);
 
三、消息主体
    包含了消息的核心数据。
    JMS定义了5中消息类型:
    TextMessage、MapMessage、BytesMessage、StreamMessage、ObjectMessage
    选择最合适的消息类型可以使JMS最有效的处理消息。
1.文本消息TextMessage
将数据作为简单字符串存放在主体中(XML就可以作为字符串发)
TextMessage msg = session.createTextMessage();
msg.setText(text);
有些厂商支持一种XML专用的消息格式,带来了便利,但是不是标准的JMS类型,影响移植性
只自己定义了两个方法setText(String s)、getText()
 
2.映射表消息MapMessage
使用一张映射表来存放其主体内容
参照Jms API
MapMessage msg = session.createMapMessage();
msg.setString(“CUSTOMER_NAME”,”John”);
msg.setInt(“CUSTOMER_AGE”,12);
 
String s = msg.getString(“CUSTOMER_NAME”);
int age = msg.getInt(“CUSTOMER_AGE”);
 
3.字节消息 BytesMessage
将字节流存放在消息主体中。适合于下列情况:必须压缩发送的大量数据、需要与现有消息格式保持一致等
参照Jms API
byte[] data;
BytesMessage msg = session.createBytesMessage();
msg.wirte(data);
 
byte[] msgData = new byte[256];
int bytesRead = msg.readBytes(msgData);
4.流消息 StreamMessage
用于处理原语类型。这里也支持属性字段和MapMessage所支持的数据类型。
使用这种消息格式时,收发双发事先协商好字段的顺序,以保证写读顺序相同
参照Jms API
StringMessage msg = session.createStreamMessage();
msg.writeString(“John”);
msg.writeInt(12);
 
String s = msg.readString();
        int age = msg.readInt();
5.对象消息 ObjectMessage
用于往消息中写入可序列化的对象。
消息中可以存放一个对象,如果要存放多个对象,需要建立一个对象集合,然后把这个集合写入消息。
 
客户端接收到一个ObjectMessage时,是read-only模式。如果一个客户端试图写message,将会抛出MessageNotWriteableException。如果调用了clearBody方法,message既可以读又可以写
自己只单独定义了两个方法:getObject()和setObject(Serializable s)
ObjectMessage包含的只是object的一个快照,set之后object的修改对ObjectMessage的body无效
Message只读时被set抛出MessageNotWriteableException;
set和get时,如果对象序列化失败抛出MessageFormatException