當(dāng)前,CORBA、DCOM、RMI等RPC中間件技術(shù)已廣泛應(yīng)用于各個領(lǐng)域。但是面對規(guī)模和復(fù)雜度都越來越高的分布式系統(tǒng),這些技術(shù)也顯示出其局限性:(1)同步通信:客戶發(fā)出調(diào)用后,必須等待服務(wù)對象完成處理并返回結(jié)果后才能繼續(xù)執(zhí)行;(2)客戶和服務(wù)對象的生命周期緊密耦合:客戶進程和服務(wù)對象進程都必須正常運行;如果由于服務(wù)對象崩潰或者網(wǎng)絡(luò)故障導(dǎo)致客戶的請求不可達(dá),客戶會接收到異常;(3)點對點通信:客戶的一次調(diào)用只發(fā)送給某個單獨的目標(biāo)對象。
面向消息的中間件(Message Oriented Middleware,MOM)較好的解決了以上問題。發(fā)送者將消息發(fā)送給消息服務(wù)器,消息服務(wù)器將消息存放在若干隊列中,在合適的時候再將消息轉(zhuǎn)發(fā)給接收者。這種模式下,發(fā)送和接收是異步的,發(fā)送者無需等待;二者的生命周期未必相同:發(fā)送消息的時候接收者不一定運行,接收消息的時候發(fā)送者也不一定運行;一對多通信:對于一個消息可以有多個接收者。
已有的MOM系統(tǒng)包括IBM的MQSeries、Microsoft的MSMQ和BEA的MessageQ等。由于沒有一個通用的標(biāo)準(zhǔn),這些系統(tǒng)很難實現(xiàn)互操作和無縫連接。Java Message Service(JMS)是SUN提出的旨在統(tǒng)一各種MOM系統(tǒng)接口的規(guī)范,它包含點對點(Point to Point,PTP)和發(fā)布/訂閱(Publish/Subscribe,pub/sub)兩種消息模型,提供可靠消息傳輸、事務(wù)和消息過濾等機制。
1.JMS
JAVA 消息服務(wù)(JMS)定義了Java 中訪問消息中間件的接口。JMS 只是接口,并沒有給予實現(xiàn),實現(xiàn)JMS 接口的消息中間件稱為JMS Provider,iLink實現(xiàn)了JMS接口,用戶可以通過使用JMS接口,在iLink中進行JMS編程。 iLink支持JMS1.0.2版本。
2.JMS接口描述
JMS 支持兩種消息類型PTP 和Pub/Sub,分別稱作:PTP Domain 和Pub/Sub Domain,這兩種接口都繼承統(tǒng)一的JMS父接口,JMS 主要接口如下所示:
|
ConnectionFactory :連接工廠,JMS 用它創(chuàng)建連接
Connection :JMS 客戶端到JMS Provider 的連接
Destination :消息的目的地
Session: 一個發(fā)送或接收消息的線程
MessageProducer: 由Session 對象創(chuàng)建的用來發(fā)送消息的對象
MessageConsumer: 由Session 對象創(chuàng)建的用來接收消息的對象
3.JMS消息模型
JMS 消息由以下幾部分組成:消息頭,屬性,消息體。
3.1 消息頭(Header) - 消息頭包含消息的識別信息和路由信息,消息頭包含一些標(biāo)準(zhǔn)的屬性如:JMSDestination,JMSMessageID 等。
|
3.2 屬性(Properties) - 除了消息頭中定義好的標(biāo)準(zhǔn)屬性外,JMS 提供一種機制增加新屬性到消息頭 中,這種新屬性包含以下幾種:
1. 應(yīng)用需要用到的屬性;
2. 消息頭中原有的一些可選屬性;
3. JMS Provider 需要用到的屬性。
標(biāo)準(zhǔn)的JMS 消息頭包含以下屬性:
|
3.3 消息體(Body) - JMS API 定義了5種消息體格式,也叫消息類型,你可以使用不同形式發(fā)送接收 數(shù)據(jù)并可以兼容現(xiàn)有的消息格式,下面描述這5種類型:
|
下例演示創(chuàng)建并發(fā)送一個TextMessage到一個隊列:
TextMessage message = queueSession.createTextMessage();
message.setText(msg_text); // msg_text is a String
queueSender.send(message);
下例演示接收消息并轉(zhuǎn)換為合適的消息類型:
Message m = queueReceiver.receive();
if (m instanceof TextMessage) {
TextMessage message = (TextMessage) m;
System.out.println("Reading message: " + message.getText());
} else {
// Handle error
}
4. 消息的同步異步接收
消息的同步接收是指客戶端主動去接收消息,JMS 客戶端可以采用MessageConsumer 的receive方法去接收下一個消息。
消息的異步接收是指當(dāng)消息到達(dá)時,主動通知客戶端。JMS 客戶端可以通過注冊一個實 現(xiàn)MessageListener 接口的對象到MessageConsumer,這樣,每當(dāng)消息到達(dá)時,JMS Provider 會調(diào)用MessageListener中的onMessage 方法。
5. PTP模型
PTP(Point-to-Point)模型是基于隊列的,發(fā)送方發(fā)消息到隊列,接收方從隊列接收消息,隊列的存在使得消息的異步傳輸成為可能。和郵件系統(tǒng)中的郵箱一樣,隊列可以包含各種消息,JMS Provider 提 供工具管理隊列的創(chuàng)建、刪除。JMS PTP 模型定義了客戶端如何向隊列發(fā)送消息,從隊列接收消息,瀏覽隊列中的消息。
下面描述JMS PTP 模型中的主要概念和對象:
|
6. PUB/SUB模型
JMS Pub/Sub 模型定義了如何向一個內(nèi)容節(jié)點發(fā)布和訂閱消息,這些節(jié)點被稱作主題(topic)。
主題可以被認(rèn)為是消息的傳輸中介,發(fā)布者(publisher)發(fā)布消息到主題,訂閱者(subscribe)從主題訂閱消息。主題使得消息訂閱者和消息發(fā)布者保持互相獨立,不需要接觸即可保證消息的傳送。
下面描述JMS Pub/Sub 模型中的主要概念和對象:
|
7. 開發(fā)JMS的步驟
廣義上說,一個JMS 應(yīng)用是幾個JMS 客戶端交換消息,開發(fā)JMS 客戶端應(yīng)用由以下幾步構(gòu)成:
用JNDI 得到ConnectionFactory 對象;
用JNDI 得到目標(biāo)隊列或主題對象,即Destination 對象;
用ConnectionFactory 創(chuàng)建Connection 對象;
用Connection 對象創(chuàng)建一個或多個JMS Session;
用Session 和Destination 創(chuàng)建MessageProducer 和MessageConsumer;
通知Connection 開始傳遞消息。
posted @ 2007-04-11 16:41 rednight 閱讀(345) | 評論 (0) | 編輯 收藏