JMS消息模型
JMS 消息由以下几部分组成:消息头,属性,消息体。
1、消息头(Header) -
消息头包含消息的识别信息和路由信息,消息头包含一些标准的属性如:JMSDestination,JMSMessageID 等。
消息头
|
由谁设置
|
JMSDestination
|
send 或 publish 方法
|
JMSDeliveryMode
|
send 或 publish 方法
|
JMSExpiration
|
send 或 publish 方法
|
JMSPriority
|
send 或 publish 方法
|
JMSMessageID
|
send 或 publish 方法
|
JMSTimestamp
|
send 或 publish 方法
|
JMSCorrelationID
|
客户
|
JMSReplyTo
|
客户
|
JMSType
|
客户
|
JMSRedelivered
|
JMS Provider
|
2、属性(Properties) -
除了消息头中定义好的标准属性外,JMS 提供一种机制增加新属性到消息头中,这种新属性包含以下几种:
1. 应用需要用到的属性;
2. 消息头中原有的一些可选属性;
3. JMS Provider 需要用到的属性。
标准的JMS 消息头包含以下属性:
JMSDestination | 消息的目的地,Topic或者是Queue | JMSDeliveryMode | 消息的发送模式:persistent或nonpersistent。前者表示消息在被消费之前,如果JMS提供者DOWN了,重新启动后消息仍然存在。后者在这种情况下表示消息会被丢失。可以通过下面的方式设置: producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); | JMSMessageID | 唯一识别每个消息的标识,由JMS Provider 产生 | JMSTimestamp | 当调用send()方法的时候,JMSTimestamp会被自动设置为当前事件。可以通过下面方式得到这个值: long timestamp = message.getJMSTimestamp(); | JMSCorrelationID | 用来连接到另外一个消息,典型的应用是在回复消息中连接到原消息 通常用来关联多个Message。例如需要回复一个消息,可以把JMSCorrelationID设置为所收到的消息的JMSMessageID | JMSReplyTo | 有时消息生产者希望消费者回复一个消息,JMSReplyTo为一个Destination,表示需要回复的目的地。当然消费者可以不理会它。 | JMSRedelivered | 如果这个值为true,表示消息是被重新发送了。因为有时消费者没有确认他已经收到消息或者JMS提供者不确定消费者是否已经收到。 | JMSType | 表示消息体的结构,和JMS提供者有关。 | JMSExpiration | 表示一个消息的有效期。只有在这个有效期内,消息消费者才可以消费这个消息。默认值为0,表示消息永不过期。可以通过下面的方式设置:producer.setTimeToLive(3600000); //有效期1小时 (1000毫秒 * 60秒 * 60分) | JMSPriority | 消息优先级,从0-9 十个级别,0-4 是普通消息,5-9 是加急消息。JMS 不要求JMS Provider 严格按照这十个优先级发送消息,但必须保证加急消息要先于普通消息到达。producer.setPriority(9); |
|
3、消息体(Body) -
JMS API 定义了5种消息体格式,也叫消息类型,你可以使用不同形式发送接收数据并可以兼容现有的消息格式,下面描述这5种类型:
消息类型
|
消息体
|
TextMessage
|
java.lang.String对象,如xml文件内容
|
MapMessage
|
名/值对的集合,名是String对象,值类型可以是Java任何基本类型
|
BytesMessage
|
字节流
|
StreamMessage
|
Java中的输入输出流
|
ObjectMessage
|
Java中的可序列化对象
|
Message
|
没有消息体,只有消息头和属性
|
|
http://www.huihoo.org/jfox/jfoxmq/mom_jms.html