技術規範
JMS(JavaMessagingService)是Java平台上有關面向訊息中間件(MOM)的技術規範,它便於訊息系統中的Java應用程式進行訊息交換,並且通過提供標準的產生、傳送、接收訊息的接口簡化企業套用的開發,翻譯為Java訊息服務。
歷史
Java訊息服務是一個在Java標準化組織(JCP)內開發的標準(代號JSR914)。2001年6月25日,Java訊息服務發布JMS1.0.2b,2002年3月18日Java訊息服務發布1.1,統一了訊息域。
體系架構
JMS由以下元素組成。
JMS提供者
連線面向訊息中間件的,JMS接口的一個實現。提供者可以是Java平台的JMS實現,也可以是非Java平台的面向訊息中間件的適配器。
JMS客戶
生產或消費基於訊息的Java的應用程式或對象。
JMS生產者
創建並傳送訊息的JMS客戶。
JMS消費者
接收訊息的JMS客戶。
JMS訊息
包括可以在JMS客戶之間傳遞的數據的對象
JMS佇列
一個容納那些被傳送的等待閱讀的訊息的區域。與佇列名字所暗示的意思不同,訊息的接受順序並不一定要與訊息的傳送順序相同。一旦一個訊息被閱讀,該訊息將被從佇列中移走。
JMS主題
一種支持傳送訊息給多個訂閱者的機制。
對象模型
JMS對象模型包含如下幾個要素:
1)連線工廠。連線工廠(ConnectionFactory)是由管理員創建,並綁定到JNDI樹中。客戶端使用JNDI查找連線工廠,然後利用連線工廠創建一個JMS連線。
2)JMS連線。JMS連線(Connection)表示JMS客戶端和伺服器端之間的一個活動的連線,是由客戶端通過調用連線工廠的方法建立的。
3)JMS會話。JMS會話(Session)表示JMS客戶與JMS伺服器之間的會話狀態。JMS會話建立在JMS連線上,表示客戶與伺服器之間的一個會話執行緒。
4)JMS目的。JMS目的(Destination),又稱為訊息佇列,是實際的訊息源。
5)JMS生產者和消費者。生產者(MessageProducer)和消費者(MessageConsumer)對象由Session對象創建,用於傳送和接收訊息。
6)JMS訊息通常有兩種類型:
①點對點(Point-to-Point)。在點對點的訊息系統中,訊息分發給一個單獨的使用者。點對點訊息往往與佇列(javax.jms.Queue)相關聯。
②發布/訂閱(Publish/Subscribe)。發布/訂閱訊息系統支持一個事件驅動模型,訊息生產者和消費者都參與訊息的傳遞。生產者發布事件,而使用者訂閱感興趣的事件,並使用事件。該類型訊息一般與特定的主題(javax.jms.Topic)關聯。
模型
Java訊息服務應用程式結構支持兩種模型:在點對點或佇列模型下,一個生產者向一個特定的佇列發布訊息,一個消費者從該佇列中讀取訊息。這裡,生產者知道消費者的佇列,並直接將訊息傳送到消費者的佇列。這種模式被概括為:
只有一個消費者將獲得訊息
生產者不需要在接收者消費該訊息期間處於運行狀態,接收者也同樣不需要在訊息傳送時處於運行狀態。
每一個成功處理的訊息都由接收者簽收
發布者/訂閱者模型支持向一個特定的訊息主題發布訊息。0或多個訂閱者可能對接收來自特定訊息主題的訊息感興趣。在這種模型下,發布者和訂閱者彼此不知道對方。這種模式好比是匿名公告板。這種模式被概括為:
多個消費者可以獲得訊息
在發布者和訂閱者之間存在時間依賴性。發布者需要建立一個訂閱(subscription),以便客戶能夠訂閱。訂閱者必須保持持續的活動狀態以接收訊息,除非訂閱者建立了持久的訂閱。在那種情況下,在訂閱者未連線時發布的訊息將在訂閱者重新連線時重新發布。
使用Java語言,JMS提供了將套用與提供數據的傳輸層相分離的方式。同一組Java類可以通過JNDI中關於提供者的信息,連線不同的JMS提供者。這一組類首先使用一個連線工廠以連線到佇列或主題,然後傳送或發布訊息。在接收端,客戶接收或訂閱這些訊息。
傳遞方式
JMS有兩種傳遞訊息的方式。標記為NON_PERSISTENT的訊息最多投遞一次,而標記為PERSISTENT的訊息將使用暫存後再轉送的機理投遞。如果一個JMS服務離線,那么持久性訊息不會丟失但是得等到這個服務恢復在線上時才會被傳遞。所以默認的訊息傳遞方式是非持久性的。即使使用非持久性訊息可能降低內務和需要的存儲器,並且這種傳遞方式只有當你不需要接收所有的訊息時才使用。
雖然JMS規範並不需要JMS供應商實現訊息的優先權路線,但是它需要遞送加快的訊息優先於普通級別的訊息。JMS定義了從0到9的優先權路線級別,0是最低的優先權而9則是最高的。更特殊的是0到4是正常優先權的變化幅度,而5到9是加快的優先權的變化幅度。舉例來說:topicPublisher.publish(message,DeliveryMode.PERSISTENT,8,10000);//Pub-Sub或queueSender.send(message,DeliveryMode.PERSISTENT,8,10000);//P2P 這個代碼片斷,有兩種訊息模型,映射遞送方式是持久的,優先權為加快型,生存周期是10000(以毫秒度量)。如果生存周期設定為零,這則訊息將永遠不會過期。當訊息需要時間限制否則將使其無效時,設定生存周期是有用的。
JMS定義了五種不同的訊息正文格式,以及調用的訊息類型,允許你傳送並接收以一些不同形式的數據,提供現有訊息格式的一些級別的兼容性。
·StreamMessage--Java原始值的數據流
·MapMessage--一套名稱-值對
·TextMessage--一個字元串對象
·ObjectMessage--一個序列化的Java對象
·BytesMessage--一個未解釋位元組的數據流
應用程式
ConnectionFactory接口(連線工廠)
用戶用來創建到JMS提供者的連線的被管對象。JMS客戶通過可移植的接口訪問連線,這樣當下層的實現改變時,代碼不需要進行修改。管理員在JNDI名字空間中配置連線工廠,這樣,JMS客戶才能夠查找到它們。根據訊息類型的不同,用戶將使用佇列連線工廠,或者主題連線工廠。
Connection接口(連線)
連線代表了應用程式和訊息伺服器之間的通信鏈路。在獲得了連線工廠後,就可以創建一個與JMS提供者的連線。根據不同的連線類型,連線允許用戶創建會話,以傳送和接收佇列和主題到目標。
Destination接口(目標)
目標是一個包裝了訊息目標標識符的被管對象,訊息目標是指訊息發布和接收的地點,或者是佇列,或者是主題。JMS管理員創建這些對象,然後用戶通過JNDI發現它們。和連線工廠一樣,管理員可以創建兩種類型的目標,點對點模型的佇列,以及發布者/訂閱者模型的主題。
Session接口(會話)
表示一個單執行緒的上下文,用於傳送和接收訊息。由於會話是單執行緒的,所以訊息是連續的,就是說訊息是按照傳送的順序一個一個接收的。會話的好處是它支持事務。如果用戶選擇了事務支持,會話上下文將保存一組訊息,直到事務被提交才傳送這些訊息。在提交事務之前,用戶可以使用回滾操作取消這些訊息。一個會話允許用戶創建訊息生產者來傳送訊息,創建訊息消費者來接收訊息。
MessageConsumer接口(訊息消費者)
由會話創建的對象,用於接收傳送到目標的訊息。消費者可以同步地(阻塞模式),或(非阻塞)接收佇列和主題類型的訊息。
MessageProducer接口(訊息生產者)
由會話創建的對象,用於傳送訊息到目標。用戶可以創建某個目標的傳送者,也可以創建一個通用的傳送者,在傳送訊息時指定目標。
Message接口(訊息)
是在消費者和生產者之間傳送的對象,也就是說從一個應用程式傳送到另一個應用程式。一個訊息有三個主要部分:
訊息頭(必須):包含用於識別和為訊息尋找路由的操作設定。
一組訊息屬性(可選):包含額外的屬性,支持其他提供者和用戶的兼容。可以創建定製的欄位和過濾器(訊息選擇器)。
一個訊息體(可選):允許用戶創建五種類型的訊息(文本訊息,映射訊息,位元組訊息,流訊息和對象訊息)。
訊息接口非常靈活,並提供了許多方式來定製訊息的內容。
提供者
要使用Java訊息服務,你必須要有一個JMS提供者,管理會話和佇列。既有開源的提供者也有專有的提供者。
開源的提供者包括:
ApacheActiveMQ
JBoss社區所研發的HornetQ
Joram
Coridan的MantaRay
TheOpenJMSGroup的OpenJMS
專有的提供者包括:
BEA的BEAWebLogicServerJMS
TIBCOSoftware的EMS
GigaSpacesTechnologies的GigaSpaces
Softwired2006的iBus
IONATechnologies的IONAJMS
SeeBeyond的IQManager(2005年8月被SunMicrosystems併購)
webMethods的JMS+-
my-channels的Nirvana
SonicSoftware的SonicMQ
SwiftMQ的SwiftMQ
IBM的WebSphereMQ