
消息服務
消息服務是以可靠的,異步的,松耦合的,語言無關的,平臺無關的以及通常是可配置的方式在分布式應用程序之間傳遞消息的軟件。消息服務通過封裝在發(fā)送者和接受者之間傳遞的消息,并提供位于分布式消息客戶之間的軟件層完成這一任務。消息服務還提供了讓消息客戶使用的接口,它隔離了底層消息服務實現(xiàn)。這樣的基礎結構還可以看成是事件通知類型的服務,其中消息是事件,在消息客戶間發(fā)送這些消息是一種事件通知機制。
理解消息傳遞
消息傳遞是一種在軟件組件或者應用之間進行通信的方法。一個消息傳遞系統(tǒng)是一個點對點的設施:一個消息傳遞客戶端可以發(fā)送消息到任何其它客戶端,或者接收來自它們的消息。每個客戶端連接到一個消息傳遞代理,消息傳遞代理提供了創(chuàng)建,發(fā)送,接受和閱讀消息的工具。
消息傳遞支持松耦合的分布式通信。組件發(fā)送消息到某個目的地,接收方可以從目的地獲取消息。但是,發(fā)送方和接收方在通信時并不需要同時可用。實際上,發(fā)送
方不需要了解任何有關接收方的內(nèi)容,而接收方也不需要了解任何有關發(fā)送方的內(nèi)容。發(fā)送方和接收方只需知道要使用什么樣的消息格式以及什么目的地。
消息傳遞和電子郵件不同,它是一種在人們之間或軟件和人們之間建立通信的方法,而消息傳遞則用于軟件應用或軟件組件之間的通信。
使用消息服務中間件的消息服務實現(xiàn):
一些中間件軟件(Weblogic,Sonic MQ等)實現(xiàn)了異步接收由消息生產(chǎn)者生成的消息,并將它們路由給消息消費者的消息服務功能。消息客戶通過消息客戶接口,以透明的方式利用中央消息服務的服務。
通過致力于使用中間件中的中央管理的持久和冗余的機制,消息中間件提高了消息服務的可靠性和可用性。消息中間件允許消息客戶與消息服務中間件服務器之間的連接,還減輕了客戶管理到多個消息服務端點位置的連接的需要。
(補圖)
Message-Oriented Middleware,MOM
面向消息的中間件和消息服務幾乎是同義詞,MOM就是消息服務的一種實現(xiàn),盡管采取的是特定類型的MOM系統(tǒng)的標準方式。MOM API定義了分布式應用程如何使用底層MOM消息信道或者隊列彼此通信。
消息在應用程序之間通過MOM傳遞,不會使消息的發(fā)送者阻塞,也就是說,發(fā)送者可以發(fā)送一個消息并讓MOM保證它到達預定的接受者,而不用等待接受者的響應。
Java Message Service(JMS)
從J2EE1.3版本開始,JMS API開始成為該平臺的一部分,應用開發(fā)者可以通過JavaEE組件來使用消息傳遞。
當JMS API在1998年引入時,它最重要的用途是允許Java應用訪問現(xiàn)有的面向消息中間件系統(tǒng),如來自IBM的MQSeries,后來JMS產(chǎn)品可以為企業(yè)應用提供一個完整的消息傳遞功能。
Java Message Service(JMS)是一個定義了消息客戶如何用標準方式與底層消息服務提供者通信的Java API。
JMS還提供了一個接口,底層消息服務提供者實現(xiàn)了這個接口,向客戶提供JMS服務。
JMS提供了點到點和發(fā)布-訂閱模型。在JMS規(guī)范中,這種消息模型也稱為消息域。點到點消息是通過實現(xiàn)消息隊列完成的,生產(chǎn)者在隊列中寫入消費者接收的消息;發(fā)布-訂閱模型是通過實現(xiàn)主題節(jié)點的層次結構完成的,其中生產(chǎn)者發(fā)布消息,消費者可以訂閱這些消息。
JMS提供了核心抽象消息API,點到點消息隊列模型API和發(fā)布-訂閱模型API都擴展這個API。
什么是JMS API
Java消息服務API允許應用創(chuàng)建發(fā)送,接收和閱讀消息。它的特點有:
1.異步:JMS供應者在接受到消息時可以將它們傳遞到某個客戶端,客戶端不必為了接收這些消息而主動發(fā)出請求。
2.可靠:JMS API可以確保某個消息傳遞而且只傳遞一次。對于那些能夠忍受消息丟失或接受到重復消息的應用,也可以使用較低級別的可靠性。
何時使用JMS API
在以下情況下,企業(yè)應用供應者更可能選擇消息傳遞API而不是某種緊耦合API:
1.供應者希望組件不依賴有關其他組件接口的信息,這樣可以很容易替換組件。
2.供應者希望應用在不管所有組件是否已經(jīng)就緒并且同時運行的情況下都能夠運行。
3.應用業(yè)務模型允許組件發(fā)送信息到其它組件并且在不必接收到立即響應的情況下繼續(xù)工作。
基本的JMS API概念
編寫基本的JMS客戶端應用必須了解以下概念:
JMS API 體系結構
消息傳遞域
消息使用
JMS API體系結構
JMS應用由以下部分所組成:
1.JMS供應者(JMS Provider):它是一個實現(xiàn)了JMS接口并提供管理和控制功能的消息傳遞系統(tǒng)。
2.JMS客戶端(JMS Client):是以Java編程語言編寫,負責生成和是喲個消息的程序或組件。任何JavaEE應用組件都可以作為JMS客戶端。
3.消息(Message):是在JMS客戶端之間進行信息溝通的對象。
4.管理對象(Administrered Object)是預先配置好的JMS對象,它是由管理員針對客戶端的使用而創(chuàng)建的。JMS管理對象的兩種類型有目的地(Destination)和連接工廠(ConnectionFactory)。
兩種消息傳遞域(模式)
點對點消息傳遞域:這種消息傳遞是建立在消息隊列,發(fā)送方和接收方的概念上的。每個消息都被尋址到某個特定的隊列,并且負責接收的客戶端從保存消息的隊列中提取這些消息。在消息被使用或過期之前,隊列會移植保存所有發(fā)送給它們的消息。它的特點有:
1.每個消息只有一個使用者(消費者),即一條消息只會被一個使用者(消費者)使用。
2.消息的發(fā)送方和接收方并沒有時間同步的依賴性。當發(fā)送方發(fā)送消息時,不管接受方是否在運行,后者都可以接收到所發(fā)送的消息。
3.接收方在成功處理完消息后會發(fā)出確認。
4.這種模式適合多個發(fā)送者對一個消費者的情況。
發(fā)布/訂閱消息傳遞域:這種消息傳遞方式中客戶端按照某個主題來處理消息,發(fā)送者和訂閱者通常是匿名的,而且可以動態(tài)的發(fā)布或訂閱內(nèi)容層次。系統(tǒng)負責將來自某個主題的多個發(fā)布者的消息分發(fā)到該主題的多個訂閱者。主題只要負責將消息分發(fā)到當前訂閱者,便同時負責保存這些消息。它的特點有:
1.每個消息可以有多個使用者。
2.發(fā)布者和訂閱者具有時間同步依賴性。訂閱了某個主題的客戶端只有在客戶端創(chuàng)建了訂閱之后才能使用所發(fā)布的消息,而且訂閱者必須繼續(xù)保持活動狀態(tài)才能使用消息。
3.這種模式適合一個發(fā)送者對多個消費者的情況。
圖:兩種JMS類層次結構
消息使用
消息傳遞產(chǎn)品本質(zhì)上是異步的:在消息的生成和使用之間并沒有基本的時間同步依賴性,JMS規(guī)定消息可以按照以下方式之一來使用:
同步:訂閱者或接收方通過調(diào)用receive方法明確獲取來自目的地的消息。Receive方法在消息到來之前可以進入阻塞狀態(tài),或者在消息未在指定時間范圍內(nèi)到達的情況下進入超時狀態(tài)。
異步:客戶端可以向使用者注冊一個消息監(jiān)聽器(message listener)。消息監(jiān)聽器類似于事件監(jiān)聽器,當消息到達目的地時,JMS供應者通過調(diào)用監(jiān)聽器的onMessage方法來傳遞消息。
JMS API的重要接口
ConnectionFactory :連接工廠,用于創(chuàng)建到特定JMS服務提供者(如Weblogic,IBM MQ或是Sonic MQ)的消息服務的連接。可以用JNDI查詢到一個JMS服務提供者管理的初始ConnectionFactory對象的句柄。它提供了返回特定Connection對象實例的方法,可以使用ConnectionFactory.createConnection()得到Connection對象的句柄。
Connection :它封裝了一個從JMS 客戶端到JMS服務提供者(JMS Provider)實例的連接 。
Destination :消息的目的地
Session:JMS會話,它與Connection相關聯(lián),便是創(chuàng)建消息的上下文。會話可以用于定義一個事務,在該事務的邊界中可以存在一組在十五中發(fā)送和接收的消息,因此,所有這些消息可包含在一個原子事務中。Session接口封裝了一個上下文,JMS消息是在這個上下文中創(chuàng)建和接收的。它還擴展了java.lang.Runnable接口,表明每一個會話運行在單個線程的上下文中,可以用Connection.createSession()方法創(chuàng)建Session對象的句柄,傳遞給方法的Boolean參數(shù)表明會話是否是事務性的。附加在會話上的監(jiān)聽器也可用于得到更多異步回調(diào)行為。MessageListener實現(xiàn)了一個onmessage()方法,對于所有由這個Session對象收到的消息,它取Message作為參數(shù),Session對象的setMessageListener和getMessageListenner分別設置和取得MessageListener。
MessageProducer: 由Session 對象創(chuàng)建的用來發(fā)送消息的對象
MessageConsumer: 由Session 對象創(chuàng)建的用來接收消息的對象
開發(fā)JMS客戶端的幾個步驟:
廣義上說,一個JMS應用是幾個JMS 客戶端交換消息,開發(fā)JMS客戶端應用由以下幾步構成:
1) 用JNDI 得到ConnectionFactory對象;
2) 用JNDI 得到目標隊列或主題對象,即Destination對象;
3) 用ConnectionFactory創(chuàng)建Connection 對象;
4) 用Connection對象創(chuàng)建一個或多個JMS Session;
5) 用Session 和Destination 創(chuàng)建MessageProducer和MessageConsumer;
6) 通知Connection 開始傳遞消息。】
JMS消息模型
JMS 消息由以下幾部分組成:消息頭,屬性,消息體。
1.消息頭(header):JMS消息頭包含了許多字段,它們是消息發(fā)送后由JMS提供者或消息發(fā)送者產(chǎn)生,用來表示消息、設置優(yōu)先權和失效時間等等,并且為消息確定路由。
2.屬性(property):由消息發(fā)送者產(chǎn)生,用來添加刪除消息頭以外的附加信息。
3.消息體(body):由消息發(fā)送者產(chǎn)生,JMS中定義了5種消息體:ByteMessage、MapMessage、ObjectMessage、StreamMessage和TextMessage。
JMS的五種專用消息類型
JMS API中定義了五種類型的消息,它們擴展了Message接口并對應于五種類型的消息正文數(shù)據(jù)。它們是:
1.TextMessage:正文為基礎java.lang.String對象的消息,如xml文件內(nèi)容。
2.MapMessage:正文為底層鍵值對集合的消息,鍵是String對象,值類型可以是Java任何基本類型。
3.BytesMessage:正文為字節(jié)集合。
4.StreamMessage:正文為Java中的輸入輸出流。
5.ObjectMessage:正文為Java中的可序列化對象(實現(xiàn)Serializable接口的對象)。
當前比較流行的JMS商業(yè)軟件和開源產(chǎn)品:
目前許多廠商采用并實現(xiàn)了JMS API,現(xiàn)在,JMS產(chǎn)品能夠為企業(yè)提供一套完整的消息傳遞功能,下面是一些比較流行的JMS商業(yè)軟件和開源產(chǎn)品。
1.
IBM MQSeries
IBM MQ系列產(chǎn)品提供的服務使得應用程序可以使用消息隊列進行相互交流,通過一系列基于Java的API,提供了MQSeries在Java中應用開發(fā)的方法。它支持點到點和發(fā)布/訂閱兩種消息模式,在基本消息服務的基礎上增加了結構化消息類,通過工作單元提供數(shù)據(jù)整合等內(nèi)容。
2.
WebLogic
WebLogic是BEA公司實現(xiàn)的基于工業(yè)標準的J2EE應用服務器,支持大多數(shù)企業(yè)級JavaAPI,它完全兼容JMS規(guī)范,支持點到點和發(fā)布/訂閱消息模式,它具有以下一些特點:
1) 通過使用管理控制臺設置JMS配置信息;
2) 支持消息的多點廣播;
3) 支持持久消息存儲的文件和數(shù)據(jù)庫;
4) 支持XML消息,動態(tài)創(chuàng)建持久隊列和主題。
3.
SonicMQ
SonicMQ是Progress公司實現(xiàn)的JMS產(chǎn)品。除了提供基本的消息驅(qū)動服務之外,SonicMQ也提供了很多額外的企業(yè)級應用開發(fā)工具包,它具有以下一些基本特征:
1) 提供JMS規(guī)范的完全實現(xiàn),支持點到點消息模式和發(fā)布/訂閱消息模式;
2) 支持層次安全管理;
3) 確保消息在Internet上的持久發(fā)送;
4) 動態(tài)路由構架(DRA)使企業(yè)能夠通過單個消息服務器動態(tài)的交換消息;
5) 支持消息服務器的集群。
4.
Active MQ
Active MQ是一個基于Apcache 2.0 licenced發(fā)布,開放源碼的JMS產(chǎn)品。其特點為:
1) 提供點到點消息模式和發(fā)布/訂閱消息模式;
2) 支持JBoss、Geronimo等開源應用服務器,支持Spring框架的消息驅(qū)動;
3) 新增了一個P2P傳輸層,可以用于創(chuàng)建可靠的P2P JMS網(wǎng)絡連接;
4) 擁有消息持久化、事務、集群支持等JMS基礎設施服務。
5.
OpenJMS
OpenJMS是一個開源的JMS規(guī)范的實現(xiàn),它包含以下幾個特征:
1) 它支持點到點模型和發(fā)布/訂閱模型;
2) 支持同步與異步消息發(fā)送;
3) 可視化管理界面,支持Applet;
4) 能夠與Jakarta Tomcat這樣的Servlet容器結合;
5) 支持RMI、TCP、HTTP與SSL協(xié)議。
Weblogic9.2中JMS的相關配置:
http://www.tkk7.com/heyang/archive/2009/09/24/296244.html
參考程序:
http://www.tkk7.com/Files/heyang/WeblogicStandardJMS_Queue20090924101108.rar
http://www.tkk7.com/Files/heyang/WeblogicStandardJMS_Topic20090924101059.rar
http://www.tkk7.com/Files/heyang/SpringJMS_Queue20090924103214.rar
http://www.tkk7.com/Files/heyang/SpringJMS_Topic20090924103204.rar