jms學習

如果手機只能進行實時通話,沒有留言和短信功能會怎麼樣?一個電話打過來,正好沒有來得及接上,那麼這個電話要傳遞的信息肯定就收不到了。爲什麼不能先將信息存下來,當用戶需要查看信息的時候再去獲得信息呢?伴隨着這個疑惑,短息和留言應運而生,無論手機是否開機、是否未及時接到,我們都能得到其中的信息。JMS提供了類似這樣的功能,本章我們將系統的學習JMS中的相關重要內容。

clip_image004

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

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

      Ø 熟悉核心和通用的JMS API

      Ø 熟悉並理解JMS客戶端開發的步驟

      Ø 消息的同步和異步接收的實現方式

      Ø 串包問題的解決辦法

企業消息系統

      Java Message Service是由Sun開發的,它爲 Java程序提供一種訪問企業消息系統的方法。在討論JMS之前,我們分來析一下企業消息系統。 
      企業消息系統,即面向消息的中間件(MOM),提供了以鬆散耦合的靈活方式集成應用程序的一種機制。它們提供了基於存儲和轉發的應用程序之間的異步數據發送,即應用程序彼此不直接通信,而是與作爲中介的MOM 通信。MOM提供了有保證的消息發送,應用程序開發人員無需瞭解遠程過程調用(PRC)和網絡/通信協議的細節。ActiveMQ正是MOM中優秀的一員。

企業消息系統的好處

我們先來看看下圖,應用程序A將Message發送到服務器上,然後應用程序B從服務器中接收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是一系列的接口及相關語義的集合,通過這些接口和和其中的方法,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)模型

clip_image010

圖 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)中,而消費者從一個消息隊列中得到消息,如下圖所示:

image

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

點對點模型的特點:

Ø  每條消息有一個消費者

      每條只有一個消費者,如果一條消息被消息者接收,那麼其他的消費者就不能得到這條消息了。

Ø 發送和接受消息與時間沒有關係

      也就是說,生產者在發送消息後,消費者可以在任意的時刻接收,但有兩個前提:

            1、消息未過期

            2、消息沒有被其他的用戶接收

      消費者也可以先運行,當生產者一運行,將消息發送到隊列中,消費者即可從隊列中獲得消息,這叫“守株待兔“。

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

      收到消息後消費者必須確認消息已被接收,否則JMS服務提供者會認爲該消息沒有被接收,那麼這條消息仍然可以被其他人接收。程序可以自動進行確認,不需要人工干預。

Ø  非持久的消息最多隻發送一次

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

            1、 JMS服務提供者出現宕機等情況,造成非持久信息的丟失

            2、 隊列中的消息過期,未被接收

Ø  持久的消息嚴格發送一次

      我們可以將比較重要的消息設置爲持久化的消息,持久化後的消息不會因爲JMS服務提供者的故障或者其他原因造成消息丟失。

發佈/訂閱模型

      發佈/訂閱模型:發佈/訂閱傳遞消息類型與主題(Topic)有關。生產者發佈消息,而消費者訂閱感興趣的消息,生產者將消息和一個特定的主題(Topic)連在一起,消息傳遞系統(MOM)根據消費者註冊的興趣,將消息傳遞給消費者。這種類型非常類似出版報紙、雜誌的形式,如下圖所示:

image

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

發佈/訂閱模型的特點:

Ø  每個消息都可以有多個(0,1,……)訂閱者

      每條消息可以有多個消費者,如果報紙和雜誌一樣,誰訂閱了誰都可以獲得。

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

      這就要求訂閱者必須先訂閱,生產者再發布。即訂閱者必須先運行,再等待生產者的運行,這和點對點類型有所差異。

Ø  訂閱者必須保持爲活動狀態才能使用這些消息

      即訂閱者必須保持活動狀態等待發布者發佈的消息,如果訂閱者在發佈者發佈消息之後才運行,則不能獲得先前發佈者發佈的消息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章