深入淺出JMS(一)——JMS簡單介紹

weixin_34377065發表於2015-01-02

      假設手機僅僅能進行實時通話,沒有留言和簡訊功能會怎麼樣?一個電話打過來,正好沒有來得及接上,那麼這個電話要傳遞的資訊肯定就收不到了。為什麼不能先將資訊存下來,當使用者須要檢視資訊的時候再去獲得資訊呢?伴隨著這個疑惑,短息和留言應運而生,不管手機是否開機、是否未及時接到,我們都能得到當中的資訊。JMS提供了相似這種功能,本章我們將系統的學習JMS中的相關重要內容。

clip_image004

      Ø 掌握JMS基本概念及適用範圍

      Ø 點對點模型與公佈/訂閱模型的差別和使用場合

      Ø 熟悉核心和通用的JMS API

      Ø 熟悉並理解JMSclient開發的步驟

      Ø 訊息的同步和非同步接收的實現方式

      Ø 串包問題的解決的方法

企業訊息系統

      Java Message Service是由Sun開發的,它為 Java程式提供一種訪問企業訊息系統的方法。在討論JMS之前,我們分來析一下企業訊息系統。
      企業訊息系統,即面向訊息的中介軟體(MOM),提供了以鬆散耦合的靈活方式整合應用程式的一種機制。它們提供了基於儲存和轉發的應用程式之間的非同步資料傳送,即應用程式彼此不直接通訊,而是與作為中介的MOM 通訊。MOM提供了有保證的訊息傳送,應用程式開發者無需瞭解遠端過程呼叫(PRC)和網路/通訊協議的細節。ActiveMQ正是MOM中優秀的一員。

企業訊息系統的優點

我們先來看看下圖,應用程式A將Message傳送到server上,然後應用程式B從server中接收A發來的訊息,通過這個圖我們一起來分析一下JMS的優點

image

圖 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是一系列的介面及相關語義的集合,通過這些介面和和當中的方法,JMSclient怎樣去訪問訊息系統,完畢建立、傳送、接收和讀取企業訊息系統中訊息。
      在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)模型

clip_image010

圖 2 JMS通訊模型

從圖中能夠看出,ClientA和ClientB是訊息生產者,通過兩種不同的目的地分別向ClientC、ClientD、ClientE和ClientF傳送訊息。
      在ClientA、C、D之間的訊息是點對點模型,使用這樣的模型,client傳送訊息到佇列目的地(Queue),從這個佇列裡面僅僅有一個訊息接收者能夠收到那個訊息,其它訪問同一目的地的接收者不會接收到該訊息。如ClientC接收Queue中的Msg1訊息,ClientD接收Queue中的Msg2訊息。
      在ClientB、E、F之間的訊息是公佈/訂閱模型。使用這樣的廣播模型,一個client傳送訊息給主題目的地(Topic),不論什麼數量的消費訂閱者能夠從這個主題目的地來接收它們。如:ClientE和ClientF都接收這個Msg3這條訊息。

點到點模型

點對點傳遞模型:生產者傳送訊息到一個特定的佇列(Queue)中,而消費者從一個訊息佇列中得到訊息,例如以下圖所看到的:

image

圖 3 點到點通訊模型示意圖

點對點模型的特點:

Ø  每條訊息有一個消費者

      每條僅僅有一個消費者,假設一條訊息被訊息者接收,那麼其它的消費者就不能得到這條訊息了。

Ø 傳送和接受訊息與時間沒有關係

      也就是說,生產者在傳送訊息後,消費者能夠在隨意的時刻接收,但有兩個前提:

            1、訊息未過期

            2、訊息沒有被其它的使用者接收

      消費者也能夠先執行,當生產者一執行,將訊息傳送到佇列中,消費者就可以從佇列中獲得訊息,這叫“守株待兔“。

Ø  消費者必須確認對訊息的接收

      收到訊息後消費者必須確認訊息已被接收,否則JMS服務提供者會覺得該訊息沒有被接收,那麼這條訊息仍然能夠被其它人接收。程式能夠自己主動進行確認,不須要人工干預。

Ø  非持久的訊息最多僅僅傳送一次

      非持久的訊息最多僅僅傳送一次,表示訊息有可能未被髮送,造成未被髮送的原因可能有:

            1、 JMS服務提供者出現當機等情況,造成非持久資訊的丟失

            2、 佇列中的訊息過期,未被接收

Ø  持久的訊息嚴格傳送一次

      我們能夠將比較重要的訊息設定為持久化的訊息,持久化後的訊息不會由於JMS服務提供者的故障或者其它原因造成訊息丟失。

公佈/訂閱模型

      公佈/訂閱模型:公佈/訂閱傳遞訊息型別與主題(Topic)有關。生產者公佈訊息,而消費者訂閱感興趣的訊息,生產者將訊息和一個特定的主題(Topic)連在一起,訊息傳遞系統(MOM)依據消費者註冊的興趣,將訊息傳遞給消費者。這樣的型別很相似出版報紙、雜誌的形式,例如以下圖所看到的:

image

圖 4 公佈/訂閱通訊模型示意圖

公佈/訂閱模型的特點:

Ø  每一個訊息都能夠有多個(0,1,……)訂閱者

      每條訊息能夠有多個消費者,假設報紙和雜誌一樣,誰訂閱了誰都能夠獲得。

Ø  訂閱者僅僅能消費他們訂閱之後出版的訊息

      這就要求訂閱者必須先訂閱,生產者再公佈。即訂閱者必須先執行,再等待生產者的執行,這和點對點型別有所差異。

Ø  訂閱者必須保持為活動狀態才幹使用這些訊息

      即訂閱者必須保持活動狀態等待公佈者公佈的訊息,假設訂閱者在公佈者公佈訊息之後才執行,則不能獲得先前公佈者公佈的訊息。

相關文章