【问题标题】:JMS auto acknowledgment consumer processing happens in onMessageJMS 自动确认消费者处理发生在 onMessage
【发布时间】:2013-09-05 05:02:48
【问题描述】:

我无法理解JMS AutoAck 网站上的以下几点: AUTO_ACKNOWLEDGE 中遵循以下行为

在调用消费者的 MessageListener 后 onMessage 方法成功返回之后(根据我的理解可能仍在进行中)

但据我了解,Consumer 实现了MessageListener 并在onMessage() 方法中进行所有处理(由Consumer 实现)

还有一个问题:我无法理解AUTO_ACKNOWLEDGEDUPS_OK_ACKNOWLEDGE 之间的区别。
我读到的是:DUPS_OK_ACKNOWLEDGE 懒惰地承认并可能再次传递相同的信息,但无法理解其实际含义。
请帮我举一个需要AUTO_ACKNOWLEDGE 和需要DUPS_OK_ACKNOWLEDGE 的实际示例


Added 5th Sep13 :从Java Redeliver and transaction添加一个点

考虑在消息处理过程中发生故障。发生什么了 消息?消息是否会丢失或重新发送成功 后期处理?这些问题的答案取决于 您选择的交易选项。

【问题讨论】:

    标签: java jboss jms activemq


    【解决方案1】:

    来自Transaction and redelivery in JMS的一些引用


    自动模式:当会话使用自动模式时,会话发送或接收的消息会被自动确认。这是最简单的模式,通过启用一次性消息传递保证来表达 JMS 的强大功能。

    阅读消息也意味着确认。 所以AUTO_ACKNOWLEDGE 很简单。但是,如果您使用的是QueueReceiver 而没有setMessageListener,并且消息处理失败,则消息会丢失。


    重复正常模式:当会话使用重复正常模式时,会话发送或接收的消息会自动确认,就像自动模式一样,尽管是延迟的。在极少数情况下,消息可能会多次传递。此模式启用至少一次消息传递保证。

    类似于AUTO_ACKNOWLEDGE,开销较小,但应用程序必须能够处理重复消息。如果性能很重要,并且重复消息不是问题,您可以使用它。


    客户端模式:当会话使用客户端模式时,会话发送或接收的消息不会自动确认。应用程序必须确认消息接收。这种模式让应用程序(而不是 JMS 提供者)可以完全控制消息确认,但会增加代码复杂性。

    使用这种方法,如果您处理一条消息,并在完成此任务后,则显式调用message.acknowledge()。如果在处理过程中发生异常,消息不会丢失(它将被重新传递)。


    至于您问题的第一部分,请查看 Javadoc AUTO_ACKNOWLEDGE。引用:

    使用这种确认模式,会话会自动确认客户端收到消息

    当会话从接收调用成功返回时

    或者当会话调用来处理消息的消息监听器成功返回。

    链接的文章符合此描述(仅在onMessage 成功时确认)。

    我已经使用 JBoss 7 对此进行了测试,使用 AUTO_ACKNOWLEDGEMessageListener:如果 onMessage 出现异常,消息实际上未重新传递

    【讨论】:

    • 感谢您的回答。我有两点 (1) 使用带有 MessageListener 的 AUTO_ACKNOWLEDGE: 如果 onMessage 出现异常,消息实际上不会在 JBoss 4.x 上重新传递(但在 ActiveMQ 5.x 上重新传递)。我很迷惑。 (2)链接的文章状态(至少我理解)确认(在自动确认模式下)在调用消费者的MessageListener(可能仍在进行中)后onMessage方法成功返回后立即发送
    • 我找到了权威来源,所以链接的文章是正确的。 JBoss 4(您的测试)和 JBoss 7(我的测试)不会重新交付(至少不是一次),现在我认为这是一个错误。我已经更新了答案。
    • @ Beryllium 感谢更新的答案,一个问题:你/java 文档在这里所说的会话是什么意思(是 QueueSession)?
    • 是的,QueueSessionTopicSession(两者都扩展 javax.jms.Session
    猜你喜欢
    • 1970-01-01
    • 2019-10-27
    • 2018-04-16
    • 1970-01-01
    • 2012-11-26
    • 1970-01-01
    • 2013-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多