1. JMS消息有以下幾部分組成:消息頭、屬性和消息體
2. 消息頭包含消息的識別信息和路由信息,消息頭包含的一些屬性如下:
- JMSDestination:由send方法設置
- JMSDeliveryMode: 由send方法設置
- JMSExpiration:由send方法設置
- JMSPriority:由send方法設置
- JMSMessageId: 由send方法設置
- JMSTimestamp:由客户端設置
- JMSCorrelationId:由客户端設置
- JMSReplyTo: 由客户端設置
- JMSType: 由客户端設置
- JMSRedelivered:由JMS provider設置
3. 標準的JMS消息頭包含以下屬性:
- JMSDestination:消息發送的目的地。主要是指Queue和topic,自動分配
- JMSDeliveryMode:傳送模式。有兩種:持久模式和非持久模式。一條持久性的消息應該被傳送“一次僅僅一次”,這就意味着如果JMS提供者出現故障,JMS消息不會丟失,它會在服務器恢復之後繼續傳遞。一條非持久性的消息最多會傳遞一次,這就意味着服務器出現故障,該消息永久丟失。
- JMSExpiration:消息過期時間。等於Destination的send方法中的timeToLive值加上發送時刻的GMT時間值。如果timeToLive值等於零,則JMSExpiration被設置為零,表示該消息永不過期。如果發送後,在消息過期時間之後消息還沒有被髮送到目的地,則該消息被清除。自動分配
- JMSPriority:消息優先級。從0-9十級,0-4是普通消息,5-9是加急消息。JMS不要求JMS provider嚴格按照這十個優先級發送消息,但必須保證加急消息要優先於普通消息到達目的地。默認是4級。自動分配
- JMSMessageId:唯一識別每個消息的標誌,由JMS provider產生,自動分配
- JMSTimestamp:一個JMS provider在調用send()自動設置的,它是消息被髮送和接收的實際時間差。自動分配
- JMSCorrelationId:用來連接到另外一個消息。典型的應用在回覆消息連接到原消息。在大多數情況下,JMSCorrelationId用於將一條消息標記為對JMSMessageId標識上的一個消息的應答。不過JMSCorrelationId是任何值不一定是JMSMessageId,有開發者設置
- JMSReplyTo:提供本消息回覆消息的目的地,有開發者設置
- JMSType:消息類別的識別符。有開發者設置
10.JMSRedelivered:如果一個客户端端收到了設置了JMSRedelivered屬性的消息,則表示客户端可能在早些時候曾經收到過該消息,但並沒有被簽收(acknowledge)。如果該消息重新發送,JMSRedelivered = true 反之 JMSRedelivered = false,自動設置
4. 消息體,JMS API 定義了5中消息體格式,也叫消息類型,可採用不同的形式發送接收數據,並可以兼容現有的消息格式。包括:TextMessage、MapMessage、BytesMessage、StreamMessage、ObjectMessage。
5. 消息屬性,包含以下三種類型的屬性:
1.應用程序設置或添加的屬性
Message.setStringProperty("name", name)
2.JMS定義的屬性
使用“JMSX”作為屬性的前綴
Connection.getMetaData().JMSXPropertyNames(),方法返回所有支持的JMSX的屬性名稱
3.JMS提供商特定的屬性
6. JMS定義的屬性如下:
- JMSXUserID:發送消息的用户標識。發送時提供商設置
- JMSXAppID:發送消息的應用標識。發送時提供商設置
- JMSXDeliveryCount:轉發消息重試次數。第一次是1,第二次是2,……,發送時提供商設置
- JMSXGroupID:消息所在消息組的標識,客户端設置
- JMSXGroupSeq:組內消息的序號,第一個是1,第二個是2,……,客户端設置
- JMSXProducerTXID:產生消息的事務的事務標識,發送時提供商設置
- JMSXConsumerTXID:消費消息的事務的事務標識,接收時提供商設置
- JMSXRcvTimestamp:JMS轉發消息到消費者的時間,接收時提供商設置
- JMSXState:假定存在一個消息倉庫,它儲存了每個消息的單獨拷貝,且這些消息從原始消息發送開始,每個拷貝的狀態有:1(等待)、2(準備)、3(到期)或4(保留)。由於狀態與生產者和消費者無關,所以它不是由它們來提供,它只和在倉庫中查找消息相關,因此JMS消息沒有提供相關的API,所以由提供商設置