1

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

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

但据我了解,消费者实现MessageListener并执行onMessage()方法中的所有处理(由消费者实现)

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


2013 年 9 月 5 日添加:从Java 重新交付和交易中添加一个点

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

4

1 回答 1

6

JMS中交易和重新交付的一些报价


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

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


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

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


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

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


至于您问题的第一部分,请查看 AUTO_ACKNOWLEDGE的 Javadoc 。一个报价:

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

当会话成功从接收呼叫返回时

或者当会话调用以处理消息的消息侦听器成功返回时。

链接的文章符合此描述(仅确认,如果onMessage成功)。

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

于 2013-09-02T12:01:54.027 回答