消息是整個JMS規範最爲重要的部分。一個JMS應用程序中的所有數據和事件都是使用消息進行通信的,同時JMS的其餘部分也在消息傳輸服務。
一個 Message 對象有3個部分:消息頭,消息屬性和消息數據本身,也稱有效負載或消息體。
消息頭:每條消息都有一組標準的消息頭。每個消息頭都由一組取值函數和賦值函數方法所標識。消息頭分爲兩大類:自動分配消息頭和開發者分配消息頭。
自動分配消息頭:大多數消息頭都是自動分配的,在傳送消息時,消息頭的值由JMS提供者來設置,因此開發者使用 setJMS<HEADER>() 方法就會被忽略。不過一些消息頭可以再創建 Session 和 MessageProvider 時,有開發者通過編程方式來設置。以下是自動分配消息頭:
JMSDestination: 該消息頭是使用一個Topic 或 Queue 對象來標識目的地。
JMSDeliveryMode: 傳送模式。在JMS中消息有兩種傳輸模式:持久模式和非持久模式。一條持久消息應該被傳送“一次且僅一次”,一條非持久消息最多被傳送一次。
JMSMssageID: 消息的唯一標識(其實現取決於具體廠商),是個String類型的值。
JMSTimestamp: JMS提供者接受消息的時間,而不是該消息實際傳送的時間,long 型。
JMSExpiration: 消息對象的有效期,毫秒爲單位。
JMSRedelivered: 如果消息被重傳則爲 true,否則爲 false。
JMSPriority: 消息的優先級,共兩類:0-4普通優先級,4-9加急優先級。
開發者消息頭:必須由消息生產者在傳送消息前顯式設置:
JMSReplyto: 在某些情況下,一個JMS消息生產者可能會要求消費者對一條消息做出應答。JMSReplyto 消息頭包含了一個 javax.jms.Destination,標明瞭JMS消費者應該應答的地址。
JMSCorrelationID: 用於將當前消息和先前某些消息或應用程序特定的ID關聯起來。大多數情況下,用於將一條消息標記爲對 JMSMessageID 標識的一條消息的應答。
JMSType: 可選消息頭。標識消息結構和有效負載。
消息屬性:像消息的附加消息頭一樣。允許開發者添加有關消息的不透明附加信息。它們還可以暴露消息選擇器在消息過濾時使用的數據。消息的屬性可以是String、boolean、byte、double、int、float 或 long類型。消息屬性有3中基本類型:應用程序特定的屬性、JMS定義的屬性和提供者特定的屬性。
應用程序特定的屬性:由應用程序開發者定義的所有屬性可以作爲一個應用程序特定的屬性。應用程序屬性在消息傳送之前進行設置。並不存在預先定義的應用程序屬性,開發者可以自由定義能滿足他們需要的任何屬性。javax.jms.Message 接口爲每種類型的屬性值都提供了取值函數和賦值函數方法。
package javax.jms; public interface Message { // getter and setter }
JMS定義的屬性:JMSXUserID
JMSXAppID
JMSXProduceTXID
JMSXConsumerTXID
JMSXRcvTimestamp
JMSXDeliveryCount
JMSXState
JMSXGroupID
JMSXGroupSeq
提供者定義的屬性:每個提供者(JMS的實現者)都可以定義一組私有屬性,這些屬性可以由客戶端或提供者自動設置。必須以JMS爲前綴。
消息類型:JMS定義了6中JMS提供者必須支持的接口類型(以下就不做具體展開了,只列舉以下):
Message
TextMessage
ObjectMessage
BytesMessage
StreamMessage
MapMessage
參考資料:
《Java消息服務》第二版, Mark Richards, Richard Monson-Haefel & David A. Chappell 著, 閆懷志 譯。