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