一.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開頭,後面緊接着是屬性名稱。提供者特定的屬性,其作用就是支持廠商的私有特性。