上节使用一个Chat的小例子说明了一下怎么使用ActiveMQ开发一个发布/订阅者模型。
前期回顾:05_Java通信_JMS_demo
这节来详细说一下一条消息的结构。
消息头
每一个JMS的消息都有一个固定格式的消息头,这些数据被提供set/get方法设置和获取。但是不是所有的消息头数据都需要设置,或者都能设置成功,部分是由JMS实现厂商设置好的。所以我们将这些消息头分为JMS自动分配消息头和开发者设置消息头。
下面是所有消息头的列表:
JMS自动分配消息头
JMSDestination:获得对象标识目的地:Topic或者queue
JMSDeliveryMode:获得消息的持久模式,如果是持久性,那么JMS提供者出现故障,该消息不会丢失,在服务器恢复后再次传送,非持久模式,如果JMS出现故障,该消息可能永久丢失
JMSMessageID:String类型的值,唯一标识一条消息
JMSTimestamp:在messageProducer在调用send()操作时自动设置,包含JMS提供者接收消息的时间
JMSExpiration:一个message对象的有效期,避免把过期的消息送给消费者
JMSRedelivered:消息被重新传送给消费者,如果该消息被重新传送JMSRedelivered消息头就为true,否则为false
JMSPriority:消息的优先级0-4普通;5-9加急
开发者设置消息头
JMSReplyTo:标明了JMS消费者应该应答的地址,在使用请求/应答模型时,通过这条消息头属性可以进一步实现生产者和消费者之间的去耦
JMSCorrelationID:用于将当前消息和先前的某些消息或者应用程序特定的ID关联起来
JMSType:标识消息结构和有效负载类型
消息属性
类似于消息头的附加信息,允许开发者添加不透明的附加信息。
类型:
应用程序特定属性
开发者提供,保存在message对象中,提供了多种类型的属性。属性如下
JMS定义的属性
JMS厂商提供特定属性
以上两种都是厂商提供绑定在消息头的附加信息
消息类型(有效负载)
Message接口是根据它们携带的有效负载种类来定义的
JMS提供了6个接口,来实现不同数据类型的负载
PS:上面划的是Message接口,其他5个都是类。其实其他5个也是接口!
TextMessage表示消息是一个文本格式
StreamMessage表示是流格式
MapMessage表示以键值对的形式传递消息
ObjectMessage消息的信息是一个对象,这个对象必须能够序列化
ByteMessage表示消息是字节流作为有效负载