2015-10-06 47 views
0

我有一個Spring DMLC形式的主題和相應的訂閱者。我的問題與以下情況有關:在長時間運行過程的主題上的多個消息期間的主題訂閱者行爲

在主題上發佈消息並且訂閱者開始處理消息。如果在處理上一條消息時另一條消息到達此主題,則假設訂閱者處於忙碌狀態,或者處理上一條消息之後將處理此消息,新消息是否會丟失。

如果答案是第二條消息將在第一條消息之後被處理,那麼後續問題是該行爲是由代理處理還是處理該消息的訂戶。

回答

1

除非客戶取消訂閱(或死亡),否則下一條消息不會丟失 - 您可以使訂閱持久化,這意味着即使在這種情況下消息也不會丟失。

這(消息處理)是在代理的控制下,而不是客戶端;訂閱是否耐用取決於客戶端。

一些經紀人提供的預取功能,在這種情況下,消息可能,同時它還是處理當前一個被髮送到客戶端,但它仍然不會丟失,如果客戶死亡,因爲只有在它被刪除的消息被承認。

1

第二條消息是否會在第一條消息之後被處理?

這種行爲是由經紀人或用戶處理必須處理 呢?

消息的副本將由代理保存,即代理處理此消息。

也只是需要注意的是,有2種類型的JMS主題訂閱者:

(1)非持久訂閱者:經紀人保留複製(在內存中)只有當用戶處於Active狀態。

(2)持久訂閱者:即使用戶未處於活動狀態,代理也會保留副本(在內存+文件系統中)。

請找到以下Oracle文檔:

爲了確保發佈/訂閱應用程序接收所有發佈的消息, 使用持久傳遞模式的出版商。另外,爲用戶使用 持久訂閱。

如果將 主題指定爲目標,則Session.createConsumer方法會創建非持久訂閱者。非持久訂戶可以僅接收在其處於活動狀態時發佈的消息。

https://docs.oracle.com/cd/E19798-01/821-1841/bncgd/index.html