2014-11-03 97 views
1

在我的previous message中,我一直在尋找解決方案來並行處理傳入消息。經過大量的試驗和錯誤,我想我可能有一個工作解決方案。在代理重啓時丟失處理器中的消息

但是,我正在處理的平臺的其中一項要求是,正在處理的消息在突然重新啓動代理的情況下需要「重新啓動」或「重新排隊」。

在測試過程中,我一次成功地啓動了多個處理器,爲每個消息執行一個工作單元。我突然重新啓動代理時發現的是,處理器內部「正在處理」的任何消息實際上已經丟失。但是,當處理器拋出故意的異常時,該消息被重新傳送到隊列中。

如何保護正在處理的消息(並且工作單元尚未完成)? 任何意見是高度讚賞。

注意:最終的實現將使用一個tcp負載均衡器後面的兩個相同代理的主 - 主設置。

+0

您是否正在使用事務並且有問題的消息是否持久? – 2014-11-03 14:45:47

+0

使用DeliveryMode.PERSISTENT將消息發佈到隊列中。不知道如何將交易添加到我的處理器。目前,如果我殺死了activemq的java進程,那麼所有「正在進行的」消息都消失了。 – djBo 2014-11-03 16:00:38

+0

我只是將交易添加到每條路線,但隨後消息不再被並行處理... – djBo 2014-11-03 16:28:40

回答

0

爲了保留您的消息,您必須使用具有持久消息傳遞的事務。如果沒有事務處理會話,並不是所有的異常情況都會被覆蓋,特別是如果您使用的是默認的AUTO_ACKNOWLEDGE,它會告訴代理您已經使用了該消息,所以只要消息已經傳遞,就馬上開始刪除它。這就是爲什麼當你重新啓動經紀人時,你會失去你的信息。沒有其他解決方法。

假設您的交易設置正確,那麼沒有理由不應該能夠並行處理。 This blog is a bit older now,但仍然充滿了良好的信息,以確保您正確地設置您的交易。

+0

不幸的是,這並不像預期的那樣工作,特別是當使用AsyncProcessor接口串聯處理時。從http://camel.apache.org/jms.html我讀了設置asyncConsumer = true被忽略,一旦你設置transacted = true。我可能會在Camel 3.0中獲得對異步交易的支持:( – djBo 2014-11-04 17:56:27

+0

這是一個單獨的問題。爲了迴應你的問題,在代理刪除它之前確保消息完全處理的唯一選擇是使用交易。 – 2014-11-06 00:50:43

+0

難道你不能使用'CLIENT_ACKNOWLEDGE'確保所有消息的至少一次交付?您將在代理重啓時獲得重新投遞而不是未交付,但是如果消費者可以處理該消息,您將避免丟失消息... – Tim 2014-11-11 19:49:28