005.JMS可靠性機制

1. 消息接收確認

JMS消息只有在被確認以後,才認爲已經被成功地消費了。消息的成功消費一般包含三個階段:異步

  • 客戶接收消息
  • 客戶處理消息
  • 消息被確認

在事務性會話中,當一個事務被提交的時候,確認自動發生。
在非事務性會話中,消息什麼時候被確認取決於建立會話時的應答模式(Acknowledge mode),該參數有如下三個可選值ide

  • Session.AUTO_ACKNOWLEGDE: 當消費者成功的從receive方法返回的時候,或者從MessageListener.onMessage方法成功返回的時候,會話自動確認消費者收到的消息。
  • Session.CLIENT_ACKNOWLEDGE: 客戶經過調用消息的acknowledge方法確認消息。須要注意的是,在這種模式中,確認是在會話層上進行,確認一個被消費的消息將自動確認全部已被會話消費的消息。例如,若是一個消息消費者消費了10個消息,而後確認第5個消息,那麼全部10個消息都被確認。
  • Session.DUPS_ACKNOWLEDGE: 該選擇只是會話遲鈍的確認消息的提交。若是JMS provider失敗,那麼可能會致使一些重複的消息。若是是重複的消息,那麼JMS provider必須把消息頭的JMSRedelivered字段設置爲true。

2. 消息的持久性

JMS支持一下兩種消息的提交模式:工具

  • PERSISTENT: 指示JMS provider持久保存消息,以保證消息不會由於JMS provider的失敗而丟失;
  • NON_PRESISTENT: 不要求JMS provider持久保存消息。

3. 消息的優先級

可使用消息優先級來指示JMS provider首先提交緊急的消息。優先級分10個級別,從0(最低)到9(最高)。若是不指定優先級,默認級別是4。須要注意的是,JMS provider並不必定保證按照優先級的順序提交消息。code

4. 消息過時

能夠設置消息在必定時間後過時,默認是永不過時能夠設置消息在必定時間後過時,默認是永不過時。隊列

5. 消息的臨時目的地

能夠經過會話上的createTemporaryQueue 方法和createTemporaryTopic方法來建立臨時目的地。它們的存在時間只限於建立它們的鏈接所保持的時間。
只有建立該臨時目的地的鏈接上的消息消費者纔可以從臨時目的地中提取消息。
能夠在producer一方,經過message.setJMSReplyTo(replyTo);方法將其傳遞給consumer,用來進行消息響應。事務

6. 持久訂閱

首先消息生產者必須使用PERSISTENT提交消息。消費者能夠經過會話上的createDurableSubscriber方法來建立一個持久訂閱,該方法的第一個參數必須是一個topic。第二個參數是訂閱名稱Subscription Name
JMS provider會存儲發佈到持久訂閱對應的topic上的消息。若是最初建立持久訂閱的客戶或者任何其它客戶,使用相同的鏈接工廠鏈接的客戶ID,相同的topic和相同的訂閱名稱Subscription Name,再次調用會話上的createDurableSubscriber方法,那麼該持久訂閱就會被激活。JMS provider會向客戶發送客戶處於非激活狀態時所發佈的消息。
持久訂閱在某個時刻只能有一個激活的訂閱者。持久訂閱在建立以後會一直保留,直到應用程序調用會話上的unsubscribe方法。ip

7. JMS的PTP模型

JMS PTP(Point-to-Point)模型定義了客戶端如何向隊列發送消息,從隊列接收消息,以及瀏覽隊列中的消息。
PTP模型是基於隊列的,生產者發消息到隊列,消費者從隊列接收消息,隊列的存在使得消息的異步傳輸成爲可能。和郵件系統中的郵箱同樣,隊列能夠包含各類消息,JMS Provider 提供工具管理隊列的建立、刪除。io

7.1. PTP的一些特色:

  1. 若是在Session 關閉時,有一些消息已經被收到,但尚未被簽收(acknowledged),那麼,當消費者下次鏈接到相同的隊列時,這些消息還會被再次接收;
  2. 若是用戶在receive 方法中設定了消息選擇條件,那麼不符合條件的消息會留在隊列中,不會被接收到;
  3. 隊列能夠長久地保存消息直到消費者收到消息。消費者不須要由於擔憂消息會丟失而時刻和隊列保持激活的鏈接狀態,充分體現了異步傳輸模式的優點;

8. JMS Pub/Sub 模型

JMS Pub/Sub 模型定義瞭如何向一個內容節點發布和訂閱消息,這些節點被稱做topictopic能夠被認爲是消息的傳輸中介,發佈者(publisher)發佈消息到topic訂閱者(subscribe)topic訂閱消息。topic使得消息訂閱者消息發佈者保持互相獨立,不須要接觸便可保證消息的傳送。List

8.1. Pub/Sub的一些特色:

  1. 消息訂閱分爲非持久訂閱和持久訂閱:
  • 非持久訂閱只有當客戶端處於激活狀態,也就是和JMS Provider保持鏈接狀態才能收到發送到某個主題的消息,而當客戶端處於離線狀態,這個時間段發到主題的消息將會丟失,永遠不會收到;
  • 持久訂閱時,客戶端向JMS 註冊一個識別本身身份的ID,當這個客戶端處於離線時,JMS Provider會爲這個ID 保存全部發送到主題的消息,當客戶再次鏈接到JMSProvider時,會根據本身的ID 獲得全部當本身處於離線時發送到主題的消息。
  1. 若是用戶在receive 方法中設定了消息選擇條件,那麼不符合條件的消息不會被接收;
  2. 非持久訂閱狀態下,不能恢復或從新派送一個未簽收的消息。只有持久訂閱才能恢復或從新派送一個未簽收的消息;
  3. 當全部的消息必須被接收,則用持久訂閱。當丟失消息可以被容忍,則用非持久訂閱。
相關文章
相關標籤/搜索