Google Code Prettify

2015年8月30日 星期日

JMS: 訊息的標頭、屬性和種類

上一篇主要是讓初次接觸 JMS 的人快速了解 JMS,對於一些細節略而不談,JMS 的訊息結構分三部份:
  1. Header (required) - 標頭
  2. Properties (optional) - 屬性
  3. Body (optional) - 訊息本體
這一篇先說明訊息的標頭、屬性和訊息本體的種類。
  • Header
JMS 的標準定義了以下的 header ...
項目說明
1JMSDestination 傳送的目的地有可能是 quque 或 topic,client 程式可以利用這個 header,如下取得 queue 或 topic 值:
Topic destination = (Topic) message.getJMSDestination();
2JMSDeliveryMode 傳送模式有兩種 - DeliveryMode.PERSISTENT 及 DeliveryMode.NON_PERSISTENT,這個標頭值可以在 producer (生產者) 端以 setJMSDeliverMode(DeliveryMode.PERSISTENT); 的方式設定。當訊息為 PERSISTENT 時,訊息至少會被 server 傳送出一次,萬一傳送過程 server 出問題,當 server 服務恢復後,就會重傳,這表示,消費者端有可能同一個訊息收到兩次; 當訊息為 NON_PERSISTENT,訊息永遠只會被送出一次,所以,萬一因各種原因沒有送到消費者,也不會重送。
3JMSMessageID JMSMessageID 的型別是 String,是由 server 端產生的一個 unique 字串,JMS 沒有規範產生的規則,所以不同廠商的 server 產生的 JMSMessageID 的規則會不相同,但都會是唯一。client 要取得這個值的方法如下:
String messageId = message.getJMSMessageID();
4JMSTimestamp這是個 long 型別的值,當訊息由生產者送到 server 端時,EMS (或其它品牌的 message server) 會設定給它當時系統時間的值,即 JMSTimestamp 所記錄的是 server 收到 producer 送來訊息的時間。
5JMSExpiration也是一個長整數的值,記錄何時這個訊息就會失效,設定這個標頭值的方法是在生產者端呼叫 setJMSExpiration(...) 或 setTimeToLive(...),如果傳入的值為 0,表示永遠不失效。
6JMSRedelivered值為 true 或 false,用來表示 server 如果沒有收到消費者端的 acknowledge,訊息是否重傳。
7JMSPriority這個值由0~9 表示訊息的重要性,數字越大表示越重要,由生產者設定,一般的訊息應設定在 0~4,重要的訊息則設定其值為 5~9。
8JMSReplyTo這個值由生產者端設定,要求消費者端回覆時,回覆到那一個 queue 或 topic,所以在消費者端一定會使用 getJMSReplyTo() 取得值。
9JMSCorrelationID這個值用來標示訊息間的關係,一種普遍的作法是,消費者端回覆訊息給生產者時,將生產者傳來的訊息的 message id 設定到 JMSCorrelationID 再回覆給生產者,這樣生產者就知道這次回覆的訊息是那一個訊息的回覆訊息。
10JMSType用來標示訊息本體是那一種型別,可能的值有 MapMessage、TextMessage、ByteMessage 等。




  • Properties
程式開發者可以利用屬性欄位來傳送一些值,作為在生產者與消費者間溝通之用。屬性是 key、value 方式設定的,所以可能的方法如下:
TestMessage msg = session.createTextMessage();
msg.setText("just for test");
msg.setStringProperty("username", "steven");
publisher.publish(msg); 
屬性的型別可以是 boolean、byte、short、int、long、float、double、String 中任一種。JMS 定義了以下的幾個屬性,但除了 JMSXGroupID 及 JMSXGroupSeq 強制廠商一定要支援外,其餘不一定要支援,所以可能你選用的產品有部份的屬性是沒有的。
  1. JMSXUserID
  2. JMSXAppID
  3. JMSProducerTXID
  4. JMSConsumerTXID
  5. JMSRcvTimestamp
  6. JMSXDeliveryCount
  7. JMSXState
  8. JMSGroupID
  9. JMSXGroupSeq
另外,Tibco EMS 自定義了以下的屬性:
  1. JMS_TIBCO_CM_PUBLISHER
  2. JMS_TIBCO_CM_SEQUENCE
  3. JMS_TIBCO_COMPRESS
  4. JMS_TIBCO_DISABLE_SENDER
  5. JMS_TIBCO_IMPORTED
  6. JMS_TIBCO_MSG_EXT
  7. JMS_TIBCO_MSG_TRACE
  8. JMS_TIBCO_PRESERVE_UNDELIVERED
  9. JMS_TIBCO_SENDER
  10. JMS_TIBCO_SS_SENDER
  • Types
  1. TextMessage
  2. StreamMessage
  3. MapMessage
  4. ObjectMessage
  5. BytesMessage
這是 JMS 定義的五個介面,這五個介面都繼承 Message 這個介面,這是 body 的五個種類。

沒有留言:

張貼留言