消息中間件和JMS&XA分佈式事務處理

消息中間件和JMS

   當前,CORBA、DCOM、RMI等RPC中間件技術已廣泛應用於各個領域。但是面對規模和複雜度都越來越高的分佈式系統,這些技術也顯示出其侷限性:(1)同步通信:客戶發出調用後,必須等待服務對象完成處理並返回結果後才能繼續執行;(2)客戶和服務對象的生命週期緊密耦合:客戶進程和服務對象進程都必須正常運行;如果由於服務對象崩潰或者網絡故障導致客戶的請求不可達,客戶會接收到異常;(3)點對點通信:客戶的一次調用只發送給某個單獨的目標對象。
   面向消息的中間件(Message OrientedMiddleware,MOM)較好的解決了以上問題。發送者將消息發送給消息服務器,消息服務器將消息存放在若干隊列中,在合適的時候再將消息轉發給接收者。這種模式下,發送和接收是異步的,發送者無需等待;二者的生命週期未必相同:發送消息的時候接收者不一定運行,接收消息的時候發送者也不一定運行;一對多通信:對於一個消息可以有多個接收者。
  已有的MOM系統包括IBM的MQSeries、Microsoft的MSMQ和BEA的MessageQ等。由於沒有一個通用的標準,這些系統很難實現互操作和無縫連接。Java Message Service(JMS)是SUN提出的旨在統一各種MOM系統接口的規範,它包含點對點(PointtoPoint,PTP)和發佈/訂閱(Publish/Subscribe,pub/sub)兩種消息模型,提供可靠消息傳輸、事務和消息過濾等機制。

1.JMS
   JAVA 消息服務(JMS)定義了Java 中訪問消息中間件的接口。JMS 只是接口,並沒有給予實現,實現JMS接口的消息中間件稱爲JMS Provider,iLink實現了JMS接口,用戶可以通過使用JMS接口,在iLink中進行JMS編程。iLink支持JMS1.0.2版本。

2.JMS接口描述
   JMS 支持兩種消息類型PTP 和Pub/Sub,分別稱作:PTP Domain 和Pub/Sub Domain,這兩種接口都繼承統一的JMS父接口,JMS 主要接口如下所示:

MS父接口

PTP

Pub/Sub

ConnectionFactory

QueueConnectionFactory

TopicConnectionFactory

Connection

QueueConnection

TopicConnection

Destination

Queue

Topic

Session

QueueSession

TopicSession

MessageProducer

QueueSender

TopicPublisher

MessageConsumer

QueueReceiver,QueueBrowse r

TopicSubscriber

  
   ConnectionFactory :連接工廠,JMS 用它創建連接
   Connection :JMS 客戶端到JMS Provider 的連接
   Destination :消息的目的地
   Session: 一個發送或接收消息的線程
   MessageProducer: 由Session 對象創建的用來發送消息的對象
   MessageConsumer: 由Session 對象創建的用來接收消息的對象

3.JMS消息模型
JMS 消息由以下幾部分組成:消息頭,屬性,消息體。
  
3.1 消息頭(Header) - 消息頭包含消息的識別信息和路由信息,消息頭包含一些標準的屬性如:JMSDestination,JMSMessageID 等。

消息頭

由誰設置

JMSDestination

send 或 publish 方法

JMSDeliveryMode

send 或 publish 方法

JMSExpiration

send 或 publish 方法

JMSPriority

send 或 publish 方法

JMSMessageID

send 或 publish 方法

JMSTimestamp

send 或 publish 方法

JMSCorrelationID

客戶

JMSReplyTo

客戶

JMSType

客戶

JMSRedelivered

JMS Provider

  

      


3.2 屬性(Properties) - 除了消息頭中定義好的標準屬性外,JMS 提供一種機制增加新屬性到消息頭 中,這種新屬性包含以下幾種:
   1. 應用需要用到的屬性;
   2. 消息頭中原有的一些可選屬性;
   3. JMS Provider 需要用到的屬性。
   標準的JMS 消息頭包含以下屬性:

JMSDestination

消息發送的目的地

JMSDeliveryMode

傳遞模式, 有兩種模式: PERSISTENT 和NON_PERSISTENT,PERSISTENT表示該消息一定要被送到目的地,否則會導致應用錯誤。NON_PERSISTENT表示偶然丟失該消息是被允許的,這兩種模式使開發者可以在消息傳遞的可靠性和吞吐量之間找到平衡點。

JMSMessageID

唯一識別每個消息的標識,由JMS Provider 產生。

JMSTimestamp

一個消息被提交給JMS Provider 到消息被髮出的時間。

JMSCorrelationID

用來連接到另外一個消息,典型的應用是在回覆消息中連接到原消息。

JMSReplyTo

提供本消息回覆消息的目的地址

JMSRedelivered

如果一個客戶端收到一個設置了JMSRedelivered 屬性的消息,則表示可能該客戶端曾經在早些時候收到過該消息,但並沒有簽收(acknowledged)。

JMSType

消息類型的識別符。

JMSExpiration

消息過期時間,等於QueueSender 的send 方法中的timeToLive 值或TopicPublisher 的publish方法中的timeToLive 值加上發送時刻的GMT 時間值。如果timeToLive值等於零,則JMSExpiration被設爲零,表示該消息永不過期。如果發送後,在消息過期時間之後消息還沒有被髮送到目的地,則該消息被清除。

JMSPriority

消息優先級,從0-9 十個級別,0-4 是普通消息,5-9 是加急消息。JMS 不要求JMS Provider 嚴格按照這十個優先級發送消息,但必須保證加急消息要先於普通消息到達。

3.3 消息體(Body) - JMS API 定義了5種消息體格式,也叫消息類型,你可以使用不同形式發送接收 數據並可以兼容現有的消息格式,下面描述這5種類型:

消息類型

消息體

TextMessage

java.lang.String對象,如xml文件內容

MapMessage

名/值對的集合,名是String對象,值類型可以是Java任何基本類型

BytesMessage

字節流

StreamMessage

Java中的輸入輸出流

ObjectMessage

Java中的可序列化對象

Message

沒有消息體,只有消息頭和屬性



下例演示創建併發送一個TextMessage到一個隊列:
TextMessage message = queueSession.createTextMessage();
message.setText(msg_text); // msg_text is a String
queueSender.send(message);

下例演示接收消息並轉換爲合適的消息類型:
Message m = queueReceiver.receive();
if (m instanceof TextMessage) {
TextMessage message = (TextMessage) m;
System.out.println("Reading message: " + message.getText());
} else {
// Handle error
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章