如果手機只能進行實時通話,沒有留言和簡訊功能會怎麼樣?一個電話打過來,正好沒有來得及接上,那麼這個電話要傳遞的資訊肯定就收不到了。為什麼不能先將資訊存下來,當使用者需要檢視資訊的時候再去獲得資訊呢?伴隨著這個疑惑,短息和留言應運而生,無論手機是否開機、是否未及時接到,我們都能得到其中的資訊。JMS提供了類似這樣的功能,本章我們將系統的學習JMS中的相關重要內容。
企業訊息系統
Java Message Service是由Sun開發的,它為 Java程式提供一種訪問企業訊息系統的方法。在討論JMS之前,我們分來析一下企業訊息系統。
企業訊息系統,即面向訊息的中介軟體(MOM),提供了以鬆散耦合的靈活方式整合應用程式的一種機制。它們提供了基於儲存和轉發的應用程式之間的非同步資料傳送,即應用程式彼此不直接通訊,而是與作為中介的MOM 通訊。MOM提供了有保證的訊息傳送,應用程式開發人員無需瞭解遠端過程呼叫(PRC)和網路/通訊協議的細節。ActiveMQ正是MOM中優秀的一員。
企業訊息系統的好處
我們先來看看下圖,應用程式A將Message傳送到伺服器上,然後應用程式B從伺服器中接收A發來的訊息,通過這個圖我們一起來分析一下JMS的好處
圖 1 JMS通訊示意圖
提供訊息靈活性
應用程式A與應用程式B通過使用MOM的應用程式程式設計介面(API)傳送訊息進行通訊。MOM 將訊息路由給應用程式B,這樣訊息就可以存在於MOM中,MOM 負責處理網路通訊。如果網路連線不可用,MOM會儲存訊息,直到連線變得可用時,再將訊息轉發給應用程式B。
靈活性的另一方面體現在,當應用程式A傳送其訊息時,應用程式B甚至可以不處於執行狀態。MOM將保留這個訊息,直到應用程式B開始執行並試著檢索訊息為止。這還防止了應用程式A因為等待應用程式B檢索訊息而出現阻塞。
這種非同步通訊要求應用程式的設計與現在大多數應用程式不同,不過對於時間無關或並行處理,它可能是一個極其有用的方法。
鬆散耦合
企業訊息系統的真正威力在於應用程式的鬆散耦合。在上面的圖中,由應用程式A傳送訊息指定一個特定目標,如“訂單處理”。而現在,是由應用程式B提供訂單處理功能。
但是在將來,我們可以用不同的訂單處理程式替換應用程式B,應用程式A將不再是明智之選。替換應用程式將繼續傳送訊息完成“訂單處理”,而訊息也仍將得到處理。
同樣,我們也可以替換應用程式A,只要替換應用程式繼續傳送訊息進行“訂單處理”,訂單處理程式就無需知道是否有一個新的應用程式在傳送訂單。
JMS是什麼
JMS是一系列的介面及相關語義的集合,通過這些介面和和其中的方法,JMS客戶端如何去訪問訊息系統,完成建立、傳送、接收和讀取企業訊息系統中訊息。
在JMS之前,每一家MOM廠商都用專有API為應用程式提供對其產品的訪問,通常可用於許多種語言,其中包括Java語言。JMS通過MOM為Java程式提供了一個傳送和接收訊息的標準的、便利的方法。用JMS編寫的程式可以在任何實現JMS標準的MOM上執行。
JMS可移植性的關鍵在於:JMS API是由Sun作為一組介面而提供的。提供了JMS功能的產品是通過提供一個實現這些介面的提供者來做到這一點的。開發人員可以通過定義一組訊息和一組交換這些訊息的應用程式,建立JMS應用程式,實現非同步通訊。
JMS的目標
JMS從提出以來,致力於完成如下幾個目標:
定義一組訊息公用概念和實用工具。
所有Java應用程式都可以使用JMS中定義的API去完成訊息的建立、接收與傳送,任何實現了JMS標準的MOM都可以作為訊息的中介,完成訊息的儲存轉發。
最大化訊息應用程式的可移植性。
MOM提供了有保證的訊息傳送,應用程式開發人員無需瞭解遠端過程呼叫(PRC)和網路/通訊協議的細節,提供了程式的可移植性。
最大化降低應用程式與應用系統之間的耦合度。
由於MOM的存在,各個應用程式只關心和MOM之間如何進行訊息的接收與傳送,而無需關注MOM的另一邊,其他程式是如何接收和傳送的。
JMS兩種訊息模型
JMS提供了兩種訊息通訊模型:
Ø 點到點(P2P)模型
Ø 釋出/訂閱(Pub/Sub)模型
圖 2 JMS通訊模型
從圖中可以看出,ClientA和ClientB是訊息生產者,通過兩種不同的目的地分別向ClientC、ClientD、ClientE和ClientF傳送訊息。
在ClientA、C、D之間的訊息是點對點模型,使用這種模型,客戶端傳送訊息到佇列目的地(Queue),從這個佇列裡面只有一個訊息接收者可以收到那個訊息,其他訪問同一目的地的接收者不會接收到該訊息。如ClientC接收Queue中的Msg1訊息,ClientD接收Queue中的Msg2訊息。
在ClientB、E、F之間的訊息是釋出/訂閱模型。使用這種廣播模型,一個客戶端傳送訊息給主題目的地(Topic),任何數量的消費訂閱者可以從這個主題目的地來接收它們。如:ClientE和ClientF都接收這個Msg3這條訊息。
點到點模型
點對點傳遞模型:生產者傳送訊息到一個特定的佇列(Queue)中,而消費者從一個訊息佇列中得到訊息,如下圖所示:
圖 3 點到點通訊模型示意圖
點對點模型的特點:
Ø 每條訊息有一個消費者
每條只有一個消費者,如果一條訊息被訊息者接收,那麼其他的消費者就不能得到這條訊息了。
Ø 傳送和接受訊息與時間沒有關係
也就是說,生產者在傳送訊息後,消費者可以在任意的時刻接收,但有兩個前提:
1、訊息未過期
2、訊息沒有被其他的使用者接收
消費者也可以先執行,當生產者一執行,將訊息傳送到佇列中,消費者即可從佇列中獲得訊息,這叫“守株待兔“。
Ø 消費者必須確認對訊息的接收
收到訊息後消費者必須確認訊息已被接收,否則JMS服務提供者會認為該訊息沒有被接收,那麼這條訊息仍然可以被其他人接收。程式可以自動進行確認,不需要人工干預。
Ø 非持久的訊息最多隻傳送一次
非持久的訊息最多隻傳送一次,表示訊息有可能未被髮送,造成未被髮送的原因可能有:
1、 JMS服務提供者出現當機等情況,造成非持久資訊的丟失
2、 佇列中的訊息過期,未被接收
Ø 持久的訊息嚴格傳送一次
我們可以將比較重要的訊息設定為持久化的訊息,持久化後的訊息不會因為JMS服務提供者的故障或者其他原因造成訊息丟失。
釋出/訂閱模型
釋出/訂閱模型:釋出/訂閱傳遞訊息型別與主題(Topic)有關。生產者釋出訊息,而消費者訂閱感興趣的訊息,生產者將訊息和一個特定的主題(Topic)連在一起,訊息傳遞系統(MOM)根據消費者註冊的興趣,將訊息傳遞給消費者。這種型別非常類似出版報紙、雜誌的形式,如下圖所示:
圖 4 釋出/訂閱通訊模型示意圖
釋出/訂閱模型的特點:
Ø 每個訊息都可以有多個(0,1,……)訂閱者
每條訊息可以有多個消費者,如果報紙和雜誌一樣,誰訂閱了誰都可以獲得。
Ø 訂閱者只能消費他們訂閱之後出版的訊息
這就要求訂閱者必須先訂閱,生產者再發布。即訂閱者必須先執行,再等待生產者的執行,這和點對點型別有所差異。
Ø 訂閱者必須保持為活動狀態才能使用這些訊息
即訂閱者必須保持活動狀態等待發布者釋出的訊息,如果訂閱者在釋出者釋出訊息之後才執行,則不能獲得先前釋出者釋出的訊息。