【问题标题】:camel, JMS, CLIENT_ACKNOWLEDGE mode骆驼、JMS、CLIENT_ACKNOWLEDGE 模式
【发布时间】:2012-11-10 00:32:13
【问题描述】:

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

或者我可以以某种方式随意确认消息吗?

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

【问题讨论】:

    标签: jms apache-camel


    【解决方案1】:

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

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

    【讨论】:

    • 感谢兄弟节省了我的时间。
    • 可以禁用此行为,以便我可以在骆驼上下文之外手动确认消息吗?如果我根本不确认消息会发生什么?在它再次为其他消费者激活之前是否有超时?
    猜你喜欢
    • 2018-03-07
    • 2012-12-01
    • 2018-06-09
    • 2013-05-23
    • 2014-04-26
    • 1970-01-01
    • 1970-01-01
    • 2013-04-19
    • 2021-01-05
    相关资源
    最近更新 更多