我知道Camel的JMS组件,用于接收消息,使用Springs DefaultMessageListenerContainer。它可以配置为使用CLIENT_ACKNOWLEDGE模式来确认消息。我的问题是,什么时候调用message.acknowledge()方法?它是由spring的监听器容器在内部调用的吗?
或者我能否以遗憾的方式承认信息?
我想避免因为我的应用程序在处理这些邮件时崩溃并使其成为事务对我来说有点过于沉重而导致邮件丢失的情况
答案 0 :(得分:12)
行。经过一些调试和扫描源代码后,我发现Camel使用了Spring MessageListenerContainers。在CLIENT_AKNOWLEDGE模式的情况下,AbstractMessageListenerContainer调用comitIfNecessary方法确认消息。仅在注册的MessageListener成功处理消息(无例外)
之后才会发生这种情况Camel使用EndpointMessageListener,最终在路由中调用下一个处理器(或生产者)的进程方法。由于这是典型的职责链,如果路由中的任何处理器抛出异常或在Exchange上设置异常,则EndpointMessageListener将重新抛出它,从而阻止AbstractMessageListener确认消息。