JMS 的基本構件異步
- 鏈接工廠
- 鏈接工廠是客戶用來建立鏈接的對象,例如ActiveMQ 提供的ActiveMQConnectionFactory。
- 鏈接
- JMS Connection 封裝了客戶與JMS 提供者之間的一個虛擬的鏈接。
- 會話
- JMS Session是生產和消費消息的一個單線程上下文。
- 會話用於建立消息生產者(producer)、消息消費者(consumer)和消息 (message)等。
- 會話提供了一個事務性的上下文,在這個上下文中,一組發送和接收被組合到了一個原子操做中。
- 目的地
- 目的地是客戶用來指定它生產的消息的目標和它消費的消息的來源的對象。
JMS1.0.2 規範中定義了兩種消息傳遞域:點對點 (PTP)消息傳遞域和發佈/訂閱消息傳遞域。 ide
- 點對點消息傳遞域的特色以下:
- 每一個消息只能有一個消費者。
- 消息的生產者和消費者之間沒有時間上的相關性。不管消費者在生產者發送消息的時候是否處於運行狀態,它均可以提取消息。
- 發佈/訂閱消息傳遞域的特色以下:
- 每一個消息能夠有多個消費者。
- 生產者和消費者之間有時間上的相關性。
- 訂閱一個主題的消費者只能消費自它訂閱以後發佈的消息。
- JMS規範容許客戶建立持久訂閱,這在必定程度上放鬆了時間上的相關性要求。
- 持久訂閱容許消費者消費它在未處於激活狀態時發送的消息。
- 在點對點消息傳遞域中,目的地被成爲隊列(queue);在發佈/訂閱消息傳遞域中,目的地被成爲主題(topic)。
消息生產者spa
- 消息生產者是由會話建立的一個對象,用於把消息發送到一個目的地。
消息消費者線程
- 消息消費者是由會話建立的一個對象,它用於接收發送到目的地的消息。
- 消息的消費能夠採用如下兩種方法之一:
- 同步消費。經過調用 消費者的receive方法從目的地中顯式提取消息。
- 異步消費。客戶能夠爲消費者註冊一個消息監聽器,以定義在消息到達時所採起的動做。
消息對象
- JMS消息由如下三部分組成:
- 消息頭。每一個消息頭字段都有相應的getter和setter方法。
- 消息屬性。若是須要除消息頭字段之外的值,那麼可使用消息屬性。
- 消息體。JMS定義的消息類型有TextMessage、MapMessage、BytesMessage、StreamMessage和 ObjectMessage。
JMS 的可靠性機制 接口
- 確認
- JMS消息只有在被確認以後,才認爲已經被成功地消費了。
- 消息的成功消費一般包含三個階段:客戶接收消息、客戶處理消息和消息被確認。
- 在事務性會話中,當一個事務被提交的時候,確認自動發生。
- 在非事務性會話中,消息什麼時候被確認取決於建立會話時的應答模式(acknowledgement mode)。
- 該參數有如下三個可選值:
- Session.AUTO_ACKNOWLEDGE。
- 當客戶成功的從receive方法返回的時候,或者從MessageListener.onMessage方法成功返回的時候,會話自動確認客戶收到的消息。
- Session.CLIENT_ACKNOWLEDGE。
- 客戶經過消息的acknowledge方法確認消息。
- 須要注意的是,在這種模式中,確認是在會話層上進行:確認一個被消費的消息將自動確認全部已被會話消費的消息。
- 例如,若是一個消息消費者消費了10個消息,而後確認第5個消息,那麼全部10個消息都被確認。
- Session.DUPS_ACKNOWLEDGE。
- 該選擇只是會話遲鈍的確認消息的提交。
- 若是JMS provider失敗,那麼可能會致使一些重複的消息。
- 若是是重複的消息,那麼JMS provider必須把消息頭的JMSRedelivered字段設置爲 true。
- 持久性
- JMS 支持如下兩種消息提交模式:
- PERSISTENT。指示JMS provider持久保存消息,以保證消息不會由於JMS provider的失敗而丟失。
- NON_PERSISTENT。不要求JMS provider持久保存消息。
- 優先級
- 可使用消息優先級來指示JMS provider首先提交緊急的消息。
- 優先級分10 個級別,從0(最低)到9(最高)。
- 若是不指定優先級,默認級別是4。
- 須要注意的是,JMS provider並不必定保證按照優先級的順序提交消息。
- 消息過時
- 能夠設置消息在必定時間後過時,默認是永不過時。
- 臨時目的地
- 能夠經過會話上的createTemporaryQueue方法和createTemporaryTopic方法來建立臨時目的地。
- 它們的存在時間只限於建立它們的鏈接所保持的時間。
- 只有建立該臨時目的地的鏈接上的消息消費者纔可以從臨時目的地中提取消息。
- 持久訂閱
- 首先消息生產者必須使用PERSISTENT提交消息。
- 客戶能夠經過會話上的 createDurableSubscriber方法來建立一個持久訂閱,
- 該方法的第一個參數必須是一個topic。
- 第二個參數是訂閱的名稱。
-
JMS provider會存儲發佈到持久訂閱對應的topic上的消息。隊列
-
若是最初建立持久訂閱的客戶或者任何其它客戶使用相同的鏈接工廠和鏈接的客戶ID、相同的主題和相同的訂閱名再次調用會話上的createDurableSubscriber方法,那麼該持久訂閱就會被激活。事務
-
JMS provider會向客戶發送客戶處於非激活狀態時所發佈的消息。ci
-
持久訂閱在某個時刻只能有一個激活的訂閱者。get
-
持久訂閱在建立以後會一直保留,直到應用程序調用會話上的unsubscribe方法。
-
本地事務
如下是不一樣消息傳遞域的相應接口:
JMS 公共 |
點對點域 |
發佈/訂閱域 |
ConnectionFactory |
QueueConnectionFactory |
TopicConnectionFactory |
Connection |
QueueConnection |
TopicConnection |
Destination |
Queue |
Topic |
Session |
QueueSession |
TopicSession |
MessageProducer |
QueueSender |
TopicPublisher |
MessageConsumer |
QueueReceiver |
TopicSubscriber |