JMS自动确认使用者处理在onMessage中进行

时间:2013-09-02 06:56:32

标签: java jboss jms activemq

我无法理解JMS AutoAck网站上的以下内容: AUTO_ACKNOWLEDGE

中遵循以下行为
  

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

但根据我的理解,Consumer实现MessageListener并执行onMessage()方法中的所有处理(由Consumer实现)

还有一个问题:我无法理解AUTO_ACKNOWLEDGEDUPS_OK_ACKNOWLEDGE之间的差异 我读到的是:DUPS_OK_ACKNOWLEDGE懒惰地承认并可能再次发出相同的信息,但却无法理解其实际含义。
 请帮助我提供一个需要AUTO_ACKNOWLEDGE且需要DUPS_OK_ACKNOWLEDGE

的实际示例

已于9月5日添加:从Java Redeliver and transaction

添加一个点
  

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

1 个答案:

答案 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出现异常,则该消息实际上是未重新传递