關於 Jms Topic 持久訂閱

消息中間件的 Topic 機制,通常狀況下沒有保存消息。一沒鏈接,再次鏈接時不會收到失去鏈接期間的消息。這種機制在對消息可丟失的場景應用好。固然消息中間件都有保存消息的功 能。Jms 規範裏定義了 DurableSubscriber。服務器

Jms 規範中的關於持久化訂閱的一小段:session

非持久化訂閱持續到它們訂閱對象的生命週期。這意味着,客戶端只能在訂閱者活動時看到相關主題發佈的消息。若是訂閱者不活動,它會錯過相關主題的消息。
若是花費較大的開銷,訂閱者能夠被定義爲durable(持久化的)。持久化的訂閱者註冊一個帶有JMS保持的惟一標識的持久化訂閱(subscription)。帶有相同標識的後續訂閱者會再續前一個訂閱者的訂閱狀態。若是持久化訂閱沒有活動的訂閱者,JMS會保持訂閱
消息,直到消息被訂閱接收或者過時。
spa

看 Jms 規範看得暈(可能被翻譯得很差),看下關鍵代碼好理解。翻譯

要用持久化訂閱,發送消息者要用 DeliveryMode.PERSISTENT 模式發現,在鏈接以前設定。訂閱者要設置客戶端名,調用 session.createDurableSubscriber。中間件

發送者:對象

Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 
Destination destination = session.createTopic("my-topic"); 

MessageProducer producer = session.createProducer(destination); 
producer.setDeliveryMode(DeliveryMode.PERSISTENT); //設置保存消息 
connection.start(); //設置完了後,才鏈接 
生命週期

接收者:ip

connection.setClientID("client-name"); 
final Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 
 
Topic topic = session.createTopic("my-topic"); 
MessageConsumer consumer = session.createDurableSubscriber(topic, "my-sub-name"); 
connection.start(); 
io

最後,先運行 Receiver,目的是註冊這個客戶端(好讓消息中間件服務器爲這個客戶保存消息),而後關了這個 Receiver, 啓動 Sender,發現消息,再啓動 Receiver 就能夠收到離線消息。cli

能夠同時啓用普通的訂閱者:MessageConsumer consumer = session.createConsumer(topic); 做對比。

使用中以爲到,消息服務器爲每個離線註冊的客戶端保存獨立的消息,它們上線時,再發給出去。

這種機制就像聽課:老師在講課,帶有錄音機的學生就能夠簽到後逃課,持久訂閱者就是帶有錄音機的學生。

相關文章
相關標籤/搜索