2012-11-21 35 views
6

我知道Camel的用於接收消息的JMS組件使用Springs DefaultMessageListenerContainer。它可以配置爲使用CLIENT_ACKNOWLEDGE模式來確認消息。我的問題是,何時調用message.acknowledge()方法?它是由春天的聽衆容器內部調用的嗎?camel,JMS,CLIENT_ACKNOWLEDGE模式

或者我能以某種方式在我的遺囑中承認消息嗎?

我想避免的消息迷路,因爲我的應用程序,這些消息的處理過程中墜毀,並使其交易似乎有點太重了,我

回答

8

OK場景。經過一些調試和掃描源代碼後,我發現Camel使用了Spring MessageListenerContainers。在CLIENT_AKNOWLEDGE模式下,AbstractMessageListenerContainer調用comitIfNecessary方法確認消息。只有在註冊的MessageListener處理消息成功後纔會發生(無例外)

駱駝使用EndpointMessageListener,它最終調用路由下一個處理器(或生產者)的處理方法。由於這是經典的責任鏈,如果路由中的任何處理器在Exchange上拋出異常或設置異常,它將由EndpointMessageListener重新引發,從而阻止AbstractMessageListener確認消息。

+1

感謝兄弟節省了我的時間。 – andrey