1. 程式人生 > >JMS的基本概念

JMS的基本概念

JMS是什麼?

JMS Java Message Service, Java 訊息服務,是javaEE中的一項技術。

JMS規範

JMS中定義了Java中訪問訊息中介軟體的介面,並沒有給予實現,實現JMS介面的訊息中介軟體稱為 JMS Provider,例如ActiveMQ。

  • JMS Provider:實現JMS介面和規範的訊息中介軟體。
  • JMS message: JMS的訊息,JMS訊息由以下三部分組成:
  1. 訊息頭:每個訊息頭欄位都有相應的getter和setter方法;
  2. 訊息屬性:如果需要除訊息頭欄位以外的值,那麼可以使用訊息屬性;
  3. 訊息體:封裝具體的訊息資料。
  • JMS producer:訊息生產者,建立和傳送JMS訊息的客戶端應用。
  • JMS consumer:訊息消費者,接收和處理JMS訊息的客戶端應用。

訊息的消費可以採用以下兩種方法之一:

  1. 同步消費:通過呼叫消費者的receive方法從目的地中顯式提取訊息,receive方法可以一直阻塞到訊息到達。
  2. 非同步消費:客戶可以為消費者註冊一個訊息監聽器,以定義在訊息到達時所採取的動作。
  • JMS domains:訊息傳遞域,JMS規範中定義了兩種訊息傳遞域:點對點(point-to-point,簡寫成PTP)訊息傳遞域和釋出/訂閱訊息傳遞域(publish/subscribe,簡寫成pub/sub)。

點對點訊息傳遞域的特點:

  1. 每個訊息只能有一個消費者;
  2. 訊息的生成者和消費者之間沒有時間上的相關性。無論消費者在生產者傳送訊息的時候是否處於運動狀態,它都可以提取訊息。

釋出/訂閱訊息傳遞域的特點:

  1. 每個訊息可以有多個消費者
  2. 生產者和消費者之間有時間上的相關性。訂閱一個主題的消費者只能消費自它訂閱之後釋出的訊息。JMS規範允許客戶建立持久訂閱,這在一定程度上放鬆了時間上的相關性要求。持久訂閱允許消費者消費它在未處於啟用狀態時傳送的訊息。
  3. 在點對點訊息傳遞域中,目的地被稱為佇列(queue);釋出/訂閱訊息傳遞域中,目的地被稱為主題(topic)。
  • Connection factory:連線工廠,用來建立連線物件,以連線到JMS的provider。
  • JMS Connection:封裝了客戶與JMS提供者之間的一個虛擬的連線。
  • JMSSession:是生產和消費訊息的一個單執行緒上下文。

會話用於建立訊息生產者(producer)、訊息消費者(consumer)和訊息(message)等。會話提供了一個事務性的上下文,在這個上下文中,一組傳送和接收被組合到了一個原子操作中。

  • Destination:訊息傳送到目的地。
  • Acknowledge:簽收
  • Transaction:事務
  • JMS client:用來收發訊息的Java應用
  • Non-JMS client:使用JMS provider 本地API寫的應用,用來替換JMS API實現收發訊息的功能,通常會提供其他的一些特性,比如:CORBA、RMI等。
  • Administered objects:預定義的JMS物件,通常在provider規範中有定義,提供給JMS客戶端來訪問,比如:ConnectionFactory和Destination。

JMS 訊息由以下幾部分組成:訊息頭、屬性和訊息體。

訊息頭

包含訊息的識別資訊和路由資訊,訊息頭包含一些標準的屬性如下:

  • JMSDestination:由send方法設定。

訊息傳送的目的地,主要指Queue和Topic,自動分配。

  • JMSDeliveryMode:由send方法設定。

傳送模式,有兩種:持久模式和非持久模式。一條永續性的訊息應該被傳送“一次僅僅一次”,這就意味著如果JMS提供者出現故障,該訊息並不會丟失,它會在伺服器恢復之後再次傳遞。一條非持久的訊息最多會傳送一次,這意味這伺服器出現故障,該訊息將永遠丟失。自動分配。

  • JMSExpiration:由send方法設定。

訊息過期時間,等於Destination的send方法中的TimeToLive值加上傳送時刻的GMT時間值。如果TimeToLive值等於零,則JMSExpiration被設為零,表示該訊息永不過期。如果傳送後,在訊息過期時間之後訊息還沒有被髮送到目的地,則該訊息被清除。自動分配。

  • JMSPriority:由send方法設定。

訊息優先順序,從0-9十個級別,0-4是普通訊息,5-9是加急訊息。JMS不要求JMS Provider嚴格按照這十個優先順序傳送訊息,但必須保證加急訊息要優先於普通訊息到達。預設是4級。自動分配。

  • JMSMessageID:由send方法設定。

唯一識別每個訊息的標識,由JMS Provider產生。自動分配。

  • JMSTimestamp:由客戶端設定。

一個JMS Provider在呼叫send()方法時自動設定的。它是訊息被髮送和消費者實際接收的時間差。自動分配。

  • JMSCorrelationID:由客戶端設定。

用來連線到另外一個訊息,典型的應用是在回覆訊息中連線到原訊息。在大多數情況下,JMSCorrelationID用於將一條訊息標記為對JMSMessageID標識的上一條訊息的應答,不過,JMSCorrelationID可以是任何值,不僅僅是JMSMessageID。由開發者設定。

  • JMSReplyTo:由客戶端設定。

提供本訊息回覆訊息的目的地址。由開發者設定。

  • JMSType:由客戶端設定。

訊息型別的識別符。由開發者設定。

  • JMSRedelivered:由JMS Provider設定。

如果一個客戶端收到一個設定了JMSRedelivered屬性的訊息,則表示可能客戶端曾經在早些時候收到過該訊息,但並沒有簽收(acknowledged)。如果該訊息被重新傳送,JMSRedelivered=true反之,JMSRedelivered=false。自動設定。

訊息體

JMS API定義了5中訊息體格式,也叫訊息型別,可以使用不同形式傳送接收資料,並可以相容現有的訊息格式。包括:TextMessage、MapMessage、ByteMessage、StreamMessage和ObjectMessage。

訊息屬性

應用程式設定和新增的屬性,比如:

Message.setStringProperty(“username”,username);

JMS定義的屬性

使用“JMSX”作為屬性名的字首,connection.getMetaData().getJMSXPropertNames()方法返回所有連線支援的JMSX屬性的名字。JMS定義的屬性如下:

  1. JMSXUserID:傳送訊息的使用者標識,傳送時提供商設定。
  2. JMSXAppID:傳送訊息的應用標識,傳送時提供商設定。
  3. JMSXDeliveryCount:轉發訊息重試次數,第一次是1,第二次是2,...,傳送時提供商設定。
  4. JMSXGroupID:訊息所在訊息組的標識,由客戶端設定。
  5. JMSXGroupSep:組內訊息的序號,第一個是1,第二個是2,...,由客戶端設定。
  6. JMSXProducerTXID:產生訊息的事務的事務標識,傳送時提供商設定。
  7. JMSXConsumerTXID:消費訊息的事務的事務標識,接收時提供商設定。
  8. JMSXRcvTimestamp:JMS轉發訊息到消費者的時間,接收時提供商設定。
  9. JMSXState:假定存在一個訊息倉庫,它儲存了每個訊息的單獨拷貝,且這些訊息從原始訊息被髮送時開始。每個拷貝的狀態有:1(等待),2(準備),3(到期),4(保留)。由於狀態與生產者和消費者無關,所以它不是由他們來提供。它只和在倉庫中查詢訊息相關,因此JMS沒有提供給這種API。由提供商設定。