• 沒有找到結果。

1. 緒論

3.2. JMS (Java Message Service)

JMS[19][20] API 是 Sun Microsystems 所訂定訊息傳遞的標準,提供 J2EE 應用程式元件產生、傳送、接收與讀取訊息的功能。在分散式通訊的環境中,具 有鬆散式耦合、可靠與非同步的特性。

JMS 本身並非是訊息系統,是 messaging clients 與 messaging systems 溝通 所需要的介面與類別的抽象概念。如同 JDBC 使 relational database 的存取方式 抽象化;JNDI 使 naming & directory services 的存取方式抽象化。因此只要使用 JMS 的應用軟體,可以很輕易地在不同的 MOM 產品之間運作。

JMS 的產生是由於工業界努力的成果。由 JavaSoft 領導並且與多個訊息系 統業者所制定的規格。最初目的是要提供一個 Java API 來連結各個 MOM 的系 統,後來發展為更為寬廣的目標,使 JMS 成為 Java 分散式環境中的範本,如 同 RPC 在 CORBA 與 Enterprise JavaBeans 中的地位。

JMS 提供兩種訊息傳遞模式:publish-and –subscribe 與 point-to- point queuing。在 JMS 中稱之 messaging domains。在 JMS 的專有名詞之中,常以 pub/sub 與 PTP 來簡寫。

簡單的來說,pub/sub 就是以 1-N 方式廣播訊息;而 PTP 就是以 1-1 的 方式傳遞訊息。如下圖所示:

圖 22:Publish and Subscribe 示意圖

圖 23:Point-to-Point 示意圖

訊息用戶端程式,在 JMS 中稱之 JMS client;訊息系統 (也就是 MOM),

在 JMS 中稱之 JMS provider,而在商業系統中的 JMS application 指的就是包 括許多的 JMS client 與一個 JMS provider。

產生訊息的 JMS client 稱之 producer;接受訊息的 JMS 稱之 consumer。

JMS client 可以同時為 producer & consumer,兩者身分並不衝突。

z Publish/Subscribe Messaging

首先 JMS provider 必須建立起通訊的管道 『Topics』,producer 與 consumer 可以透過相同的 Topic 來互相溝通。

Consumer 對於有興趣的 Topic 做訂閱 (Subscribe) 的動作,若有 producer 對於已經訂閱的 Topic 做散佈 (Publish) 的動作時,則 JMS provider 複製此訊 息並且分別送給訂閱此 Topic 的使用者。所以單一 Topic 允許有眾多

Consumer;也允許有眾多的 producer,是多對多的通訊。

基本上 pub/sub 是一個 push-based 的模式,訊息會自動的廣播給

consumer,而這些 consumer 不必發出請求或者不定時地查看是否有新訊息。

在 pub/sub 的傳輸模式中,producer 送出訊息時,不需依賴 consumer 是 否接受到此訊息。使用 pub/sub 的 JMS client 可以建立持續性的訂閱 (durable subscription),允許 consumer 重新連線時仍可接收 producer 在斷線時所發送的 訊息。

z Point-to-Point Messaging

PTP 傳輸模式基本上與 pub/sub 是類似的,在 pub/sub 中的 producer 與 consumer 在此以 sender 與 receiver 稱之。以下則列出這兩種模式的相異之處:

¾ JMS client 彼此交換訊息的管道為 queue,為一個 destination。Sender 送訊 息至 queue;receiver 從 queue 接收訊息。

z JMS Guaranteed Messaging Property

保證傳遞是訊息系統中一個重要的部分。JMS provider 必須具有

store-and-forward 的機制,才有辦法提供保證傳遞的功能。Storage 機制是為了 儲存具有 persistent 性質的訊息,若 JMS provider 或者 consuming client 連結 發生了故障,則可重新取為此訊息。Forwarding 機制負責萃取出此訊息然後傳 遞給 consumer。

除此之外,仍需要有 Message Acknowledgments 的機制,確定訊息已經成 功送達。有了 Acknowledgment 協定則可以確定 JMS provider 已經收到 producer 產生的訊息;consumer 已經收到 JMS provider 傳遞的訊息。

以下為 Nonpersistent messages 與 durable subscriber 特性的示意圖:

圖 24:Nonpersistent messages 示意圖

JMS Provider 在接收到 Nonpersistent 訊息時,會在第一時間直接回傳 Ack 給 JMS Producer。若此時 JMS Provider 若發生障礙,此訊息可能就會遺失。

JMS Producer 在接收到 JMS Provider 的 Ack 回應,即 publish() method return。但是此時訊息已經遺失,而 JMS Producer 無法察覺,亦無法補救。

JMS Consumer JMS

Provider JMS

Producer

Persistent messages

Persistent Store 1. Send

3. Ack 4. publish()

method returns 2. Persist

5. Provider Fails 6. Message retained

in persistent store

圖 25:Persistent messages 示意圖

Persistent 類型的訊息,會在訊息標頭上加上 Persistent 的記號,JMS Provider 在接收到此類型的訊息之後,會立即將訊息儲存在 Persistent Store 之 中,下一個動作才是回 Ack 給 JMS Producer。以這樣的 Persistent 機制,可以 確保訊息傳達至 JMS Provider。若 JMS Provider 在儲存之前發生障礙,JMS Producer 則不會收到 Ack,可以再次傳送訊息;若 JMS Provider 在儲存之後發 生障礙,JMS Producer 已經接收到 Ack,所以不會再次傳送訊息,但是 JMS 仍 可在 Persistent Store 取得之前 JMS Producer 傳送的訊息

因為有了 Persistent messages 機制,當 JMS Producer 接收到 Ack 時,可 以確認訊息已經成功傳送,此時 publish() method 即可以成功 return。

圖 26:Durable subscriber 示意圖

Durable subscriber 是 JMS Provider 所提供的功能。這類型的訂閱者,若以 durable subscriber 的方式向 JMS Provider 提出接收訊息的要求,JMS Provider 必須負起訊息傳送的任務,即使 subscriber 離線,也要保存此訊息,直到 subscriber 上線為止 (或訊息過期)。

除此之外,若 JMS Consumer 發生障礙,亦可防止訊息遺失。當 JMS Provider 傳遞訊息給 JMS Consumer 時,JMS Consumer 發生障礙,JMS Provider 不會收到 JMS Consumer 回傳的 Ack,此時 JMS Provider 可從 Persistent Store 中取回之前訊息,然後再次傳送。

直到所有的 Durable subscriber 接收到訊息或者訊息過期,JMS Provider 才 會將訊息從 Persistent Store 中刪除。

相關文件