一.Message结构
Message消息是整个JMS规范最为重要的部分。一个JMS应用程序中的所有数据和事件都是使用消息进行通信的,同时JMS的其余部分也都在为消息传输服务。因此可以说,消息时一个系统的命脉所在。
一个Message对象有3个部分:消息头、消息属性,最后就是消息数据内容,它称为负载或消息体。
二.消息头
每条JMS消息都有一组标准的消息头。每个消息头都由一组取值函数和赋值函数所标识。这些方法名称紧随在术语setJMS**(),getJMS**()方法之后。如下图:
JMS消息可以分为两大类:自动分配的消息头和开发者分配的消息头。
2.1 自动分配的消息头
属性 | 说明 | 方法(get) |
---|---|---|
JMSDestination | 使用一个Topic或Queue对象来标识目的地,二者都是Destination类型 | public abstract Destination getJMSDestination() |
JMSDeliveryMode | 消息传送送模式有两种类型:持久性模式和非持久性模式 | public abstract int getJMSDeliveryMode() |
JMSMessageID | 它是一个String类型的值,唯一标识了一条消息。JMSMessageID对于JMS中消费者应用程序的历史仓库来说非常有用,它是仓库中的消息需要的唯一索引。 | public abstract String getJMSMessageID() |
JMSTimestamp | 它包含的是JMS提供者接受消息的时间,而不是该消息实际传送的时间。这条消息头用于确认发送消息和它被消费者实际接受的时间间隔。 | public abstract long getJMSTimestamp() |
JMSExpiration | 一个Message对象的有效期用来防止把过期的消息传送给消费者。对于那些数据仅在某一个时间段内有效的消息来说,非常有用的 | public abstract long getJMSExpiration() |
JMSRedelivered | 表示该消息将被重新传送给消费者。如果该消息被重新传送,JMSRedelivered消息头就为true,否则为false。 | public abstract boolean getJMSRedelivered() |
JMSPriority | 在传送一条消息时,消息生产者能够为该消息分配一个优先级。消息优先级共有两类:0~4级时普通的优先级,而5~9级则是加急优先级。 | public abstract int getJMSPriority() |
补充说明:
消息的两种传送模式(JMSDeliveryMode):
一条持久性消息应该被传送“一次而且仅仅一次”,这就意味着如果JMS提供者出现故障,该消息并不会丢失;它会在服务器恢复正常之后再次传送。一条非持久性消息最多只会传送一次,这意味着如果JMS提供者出现故障,该消息可能会永久丢失。在持久性和非持久性者两种传送模式中,消息服务器都不会讲一条消息向同一消费者发送一次以上,不过,这在技术上最有可能实现的。
2.2 开发者分配的消息头
属性 | 说明 | 方法(get) |
---|---|---|
JMSReplyTo | 一个JMS消息生产者可能会要求消费者对一条消息作出应答。JMSReplyTo消息头包含了一个javax.jms.Destination,表明JMS消费者应该应答的地址 | public abstract Destination getJMSReplyTo() |
JMSCorrelationID | 提供了一个消息头,用于将当前的消息和先前的某些消息或应用程序特定的ID关联起来 | public abstract String getJMSCorrelationID() |
JMSType | 是由JMS客户端设置的一个可选消息头。它的主要作用是标示消息结构和有效负载的类型。这个消息头并未指明正被发送的消息类型,而是JMS提供者使用的内部消息仓库的一个条目。 | public abstract String getJMSType() |
补充说明:
消息应答(JMSReplyTo)
在使用请求/应答场景时,通过这条消息头属性可以进一步实现消息生产者和消息消费者之间的去耦。实际使用中很方便
三.消息属性
消息属性就像可以分配一条消息的附加消息头一样。它们允许开发者添加有关消息的不透明附加消息。它们还用于暴露消息选择器在消息过滤时使用的数据。message接口为读取和写入属性提供了若干个取值函数和赋值函数方法。
消息属性有3中基本类型:应用程序特定的属性、JMS定义的属性和提供者特定的属性。
3.1 应用程序特定的属性
由应用程序开发者定义的所有属性都可以作为一个应用程序特定的属性。应用程序属性在消息传送之前进行设置。并不存在预定义的应用程序属性,开发者可以自由定义能够满足它们需要的任何属性。如在聊天室程序中,可以添加一个特定的属性,该属性标示了正在发送消息的用户:
TextMessage message = pubSession .createTextMessage(); message.setText(userName +":" +text ); message.setStringProperty("username" , userName ); publisher.publish(message );
作为一个应用程序的特定属性,username一旦离开Chat应用程序就变得毫无意义。她专门用于程序根据发布者身份对消息进行过滤。
3.1 JMS定义的属性
JMS定义的属性具有和应用程序属性相同的特性,除了前者大多数在消息发送时由JMS提供者来设置之外JMS定义的属性可以作为可选的JMS消息头;对于某些另有声明的例外。各厂商可以分别选择不支持、部分支持或全部支持。下面是JMS定义的9个属性清单:
3.2 提供者特定的属性
每个JMS提供者都可以定义一组私有属性,这些属性可以由客户端或提供者自动设置。提供者特定的属性必须以前缀JMS开头,后面紧接着是属性名称。提供者特定的属性,其作用就是支持厂商的私有特性。