11

我知道 Camel 的 JMS 组件,用于接收消息,使用 Springs DefaultMessageListenerContainer。它可以配置为使用 CLIENT_ACKNOWLEDGE 模式来确认消息。我的问题是,何时调用 message.acknowledge() 方法?它是由 Spring 的侦听器容器在内部调用的吗?

或者我可以按自己的意愿以某种方式确认消息吗?

我想避免消息丢失的情况,因为我的应用程序在处理这些消息的过程中崩溃了,并且使其事务性对我来说似乎有点太重了

4

1 回答 1

17

好的。经过一些调试和扫描源代码后,我发现 Camel 使用 Spring MessageListenerContainers。在 CLIENT_AKNOWLEDGE 模式下,AbstractMessageListenerContainer 调用确认消息的comitIfNecessary 方法。仅在注册 MessageListener 成功处理消息后才会发生这种情况(无例外)

Camel 使用 EndpointMessageListener ,它最终调用下一个处理器(或生产者)的过程方法。由于这是典型的责任链,如果沿途的任何处理器抛出异常或在 Exchange 上设置异常,EndpointMessageListener 将重新抛出异常,从而阻止 AbstractMessageListener 确认消息。

于 2012-11-21T21:36:34.840 回答