我无法理解JMS AutoAck网站上的以下内容:
AUTO_ACKNOWLEDGE
在调用消费者的MessageListener之后onMessage方法成功返回后(根据我的理解,它可能仍在进行中)
但根据我的理解,Consumer实现MessageListener
并执行onMessage()
方法中的所有处理(由Consumer实现)
还有一个问题:我无法理解AUTO_ACKNOWLEDGE
和DUPS_OK_ACKNOWLEDGE
之间的差异
我读到的是:DUPS_OK_ACKNOWLEDGE
懒惰地承认并可能再次发出相同的信息,但却无法理解其实际含义。
请帮助我提供一个需要AUTO_ACKNOWLEDGE
且需要DUPS_OK_ACKNOWLEDGE
已于9月5日添加:从Java Redeliver and transaction
添加一个点考虑在消息处理期间发生的故障。怎么了 消息?消息是否会丢失或重新传递以获得成功 处理以后?这些问题的答案取决于 您选择的交易选项。
答案 0 :(得分:4)
来自Transaction and redelivery in JMS
的一些引用自动模式:当会话使用自动模式时,将自动确认从会话发送或接收的消息。这是最简单的模式,通过启用一次性消息传递保证来表达JMS的功能。
阅读信息也意味着确认。
所以AUTO_ACKNOWLEDGE
很简单。但是,如果您使用的QueueReceiver
没有setMessageListener
,并且邮件处理失败,则邮件将丢失。
复制好的模式:当会话使用重复的okay模式时,会话发送或接收的消息会像自动模式一样自动确认,尽管是懒惰的。在极少数情况下,邮件可能会多次传递。此模式启用至少一次邮件传递保证。
与AUTO_ACKNOWLEDGE
类似,开销较小,但应用程序必须能够处理重复的消息。如果性能很重要,您可以使用它,并且重复的消息不是问题。
客户端模式:当会话使用客户端模式时,会话中发送或接收的消息不会自动确认。应用程序必须确认收到消息。此模式使应用程序(而不是JMS提供程序)完全控制消息确认,但代价是代码复杂性增加。
使用此方法,如果您处理一条消息,并在完成此任务后,则明确调用message.acknowledge()
。如果在处理过程中发生异常,则消息不会丢失(将重新传送)。
至于你问题的第一部分,请看看Javadoc AUTO_ACKNOWLEDGE。引用:
使用此确认模式,会话会自动确认客户收到消息
当会话已成功从接收
的呼叫返回时或当会话已调用的消息侦听器处理消息成功返回时。
链接的文章符合此说明(仅在onMessage
成功时才确认)。
我使用JBoss 7进行了测试,AUTO_ACKNOWLEDGE
使用MessageListener
:如果onMessage
出现异常,则该消息实际上是未重新传递