2013-04-16 54 views
1

我想同時使用來自多個隊列的jms消息。所有的消息應該在長時間運行處理後進入數據庫,我無權丟失它們。jms在退出onMessage()後調用message.acknowledge()

問題:是否可以保存消息以供將來確認使用,並在另一個消息正在處理時調用oldMessage.acknowledge()

我的第一個猜測是,這是不可能的,因爲它深入jms處理單元,我必須在onMessage(...)方法中處理消息和確認。

第二種猜測是同時拆分onMessage()並允許長時間運行處理許多消息。但這不是一個好的選擇,因爲我必須確保所有消息都來了訂購
第二個問題:有沒有什麼方法可以確保併發處理時的傳入順序?

+0

讓你有例如2個隊列,在第一個你得到的消息A和B,並在第二個你得到C和d?現在至少有兩個線程可以讀取它們。他們也在他們身上做了很多工作並將他們存儲在數據庫中,對吧?所以你想保持相同的順序,當他們插入數據庫? – Eugene

+0

爲了使處理併發我的意思是使每個輸入隊列的併發處理像[這裏](http://stackoverflow.com/questions/3088814/how-can-i-handle-multiple-messages-concurrently-from-a- jms-topic-not-queue-wit),所以我認爲如果我有排隊的消息A和B,那麼我想確保他們來到訂購DB關於獨家消費者的訂單 –

回答

0

1: JMS對會議這是* * CLIENT_ACKNOWLEDGE你可以看到它here的標誌。我從來沒有使用它,但似乎做你想做的。

2:

2.1:你有N個消費者對於同一個隊列:您可以探索獨家消費者一些實現有支持。 (對於AtiveMQ:here)。

2.2您每個隊列有1個消費者,但您想要排列來自所有隊列的所有消息。 您可以使用有序的SlackBuffer的概念。

您可以探索另一種可能性,例如:將所有消息重定向到維護消息順序的輸出隊列,並且您將僅使用來自該單個輸出隊列的消息。消息順序和重定向由MQ服務器完成。如果您可以控制MQ服務器,這只是一個有效的想法。

我希望這可以幫助

+0

:「經紀人將選擇一個MessageConsumer獲取隊列的所有消息以確保排序「。單一。這已經不是從隊列中併發讀取 – Eugene

+0

從[JavaDoc](http://docs.oracle.com/javaee/1.4/api/javax/jms/Message.html#acknowledge())中可以看到:A客戶端可以單獨確認每條消息的使用情況,也可以選擇將消息確認爲應用程序定義的組(這是通過調用組的最後接收消息的確認來完成的,從而確認會話消耗的所有消息。) ' 這是否意味着,如果我在任何消息上調用'acknowledge()',我將獲得所有消息的確認? –

+0

Anatoly,如果您使用的是消息組,則會應用此選項。這是一些經紀商的一個很好的功能。我也讓你[這裏](http://activemq.apache.org/message-groups.html)ActiveMQ示例與[this](http://activemq.apache.org/optimized-acknowledgement.html)。 –

相關問題