JMS開發(二):深刻PTP,Pub-Sub兩種模式

1.PTP模型

PTP(Point-to-Point)模型是基於隊列(Queue)的,對於PTP消息模型而言,它的消息目的是一個消息隊列(Queue),消息生產者每次發送消息老是把消息送入消息隊列中,消息消費者老是從消息隊列中讀取消息.先進隊列的消息將先被消息消費者讀取. 數據庫

發送方發消息到隊列,接收方從隊列接收消息,隊列的存在使得消息的異步傳輸成爲可能。和郵件系統中的郵箱同樣,隊列能夠包含各類消息,JMS Provider 提供工具管理隊列的建立、刪除。JMS PTP 模型定義了客戶端如何向隊列發送消息,從隊列接收消息,瀏覽隊列中的消息.第一節中的代碼就是PTP模型的. 服務器

下面的表格中的就是PTP模型的對象的主要概念和方法: 異步

名稱 描述
Queue 由JMS Provider 管理,隊列由隊列名識別,客戶端能夠經過JNDI 接口用隊列名獲得一個隊列對象.
TemporaryQueue
由QueueConnection 建立,並且只能由建立它的QueueConnection 使用.臨時隊列.
QueueConnectionFactory
客戶端用QueueConnectionFactory 建立QueueConnection 對象.
QueueConnection
一個到JMS PTP provider 的鏈接,客戶端能夠用QueueConnection 建立QueueSession 來發送和接收消息.
QueueSession
提供一些方法建立QueueReceiver,QueueSender,QueueBrowser 和TemporaryQueue.若是在QueueSession 關閉時,有一些消息已經被收到,但尚未被簽收(acknowledged),那麼,當接收者下次鏈接到相同的隊列時,這些消息還會被再次接收.
QueueReceiver
客戶端用QueueReceiver 接收隊列中的消息,若是用戶在QueueReceiver中設定了消息選擇條件,那麼不符合條件的消息會留在隊列中,不會被接收到.
QueueSender
客戶端用QueueSender 發送消息到隊列
QueueBrowser 
客戶端能夠QueueBrowser 瀏覽隊列中的消息,但不會收走消息.
QueueRequestor
JMS 提供QueueRequestor 類簡化消息的收發過程.QueueRequestor 的構造函數有兩個參數:QueueSession 和queue,QueueRequestor 經過建立一個臨時隊列來完成最終的收發消息請求.
可靠性(Reliability)
隊列能夠長久地保存消息直到接收者收到消息.接收者不須要由於擔憂消息會丟失而時刻和隊列保持激活的鏈接狀態,充分體現了異步傳輸模式的優點.


2.PUB/SUB模型

JMS Pub/Sub 模型定義瞭如何向一個內容節點發布和訂閱消息,這些節點被稱做主題(topic).
   主題能夠被認爲是消息的傳輸中介,發佈者(publisher)發佈消息到主題,訂閱者(subscribe) 從主題訂閱消息.主題使得消息訂閱者和消息發佈者保持互相獨立,不須要接觸便可保證消息的傳送.
   下面描述JMS Pub/Sub 模型中的主要概念和對象:
訂閱(subscription)
消息訂閱分爲非持久訂閱(non-durable subscription)和持久訂閱(durable subscrip-tion),非持久訂閱只有當客戶端處於激活狀態,也就是和JMS Provider 保持鏈接狀態才能收到發送到某個主題的消息,而當客戶端處於離線狀態,這個時間段發到主題的消息將會丟失,永遠不會收到.持久訂閱時,客戶端向JMS 註冊一個識別本身身份的ID,當這個客戶端處於離線時,JMS Provider 會爲這個ID 保存全部發送到主題的消息,當客戶再次鏈接到JMS Provider時,會根據本身的ID 獲得全部當本身處於離線時發送到主題的消息.
Topic
主題由JMS Provider 管理,主題由主題名識別,客戶端能夠經過JNDI 接口用主題名獲得一個主題對象.JMS 沒有給出主題的組織和層次結構的定義,由JMS Provider 本身定義.
TemporaryTopic
臨時主題由TopicConnection建立,並且只能由建立它的TopicConnection使用.臨時主題不能提供持久訂閱功能.
TopicConnectionFactory
客戶端用TopicConnectionFactory建立TopicConnection對象.
TopicConnection
TopicConnection是一個到JMS Pub/Sub provider的鏈接,客戶端能夠用TopicConnection建立TopicSession 來發布和訂閱消息.
TopicSession
TopicSession 提供一些方法建立TopicPublisher,TopicSubscriber,TemporaryTopic.它還提供unsubscribe方法取消消息的持久訂閱.
TopicPublisher
客戶端用TopicPublisher 發佈消息到主題.
TopicSubscriber
客戶端用TopicSubscriber 接收發布到主題上的消息.能夠在TopicSubscriber 中設置消息過濾功能,這樣,不符合要求的消息不會被接收.
Durable TopicSubscriber
若是一個客戶端須要持久訂閱消息,可使用Durable TopicSubscriber,TopSession 提供一個方法createDurableSubscriber建立Durable TopicSubscriber 對象.
恢復和從新派送(Recovery and Redelivery)
非持久訂閱狀態下,不能恢復或從新派送一個未簽收的消息.只有持久訂閱才能恢復或從新派送一個未簽收的消息.
TopicRequestor
JMS 提供TopicRequestor 類簡化消息的收發過程.TopicRequestor 的構造函數有兩個參數:TopicSession 和topic.TopicRequestor 經過建立一個臨時主題來完成最終的發佈和接收消息請求.
可靠性(Reliability)
當全部的消息必須被接收,則用持久訂閱模式.當丟失消息可以被容忍,則用非持久訂閱模式.



綜上所述,二者的API接口已經詳細的寫了出來,做爲一個Java合格的開發者,即便不背會這些,也須要理解透徹記住.接着能夠看看兩種方式的對比: ide

3.JMS規範裏的兩種message傳輸方式Topic和Queue,二者的對好比下表:


topic Queue
概要 Pub-Sub(發佈/訂閱) PTP(點對點)
有無狀態 topic數據默認是無狀態的. Queue數據是要實際介質保存的,如保存到數據庫.
完整性保障 並不保證publisher發佈的每條數據,Subscriber都能接受到.
Queue保證每條數據都能被receiver接收.
消息是否會丟失
通常來講publisher發佈消息到某一個topic時,只有正在監聽該topic地址的sub可以接收到消息;若是沒有sub在監聽,該topic就丟失了.
Sender發送消息到目標Queue,receiver能夠異步接收這個Queue上的消息.Queue上的消息若是暫時沒有receiver來取,也不會丟失.
消息發佈接收策略 一對多的消息發佈接收策略,監聽同一個topic地址的多個sub都能收到publisher發送的消息.Sub接收完通知服務器.
一對一的消息發佈接收策略,一個sender發送的消息,只能有一個receiver接收.receiver接收完後,通知服務器已接收,服務器對queue裏的消息採起刪除或其餘操做.

OK,here it is.Over.繼續第三章. 函數

相關文章
相關標籤/搜索