ActiveMq,如果客户端在Ack之前终止会发生什么

时间:2012-06-28 21:14:35

标签: jms activemq

我有一个持久性队列,非交易,客户端确认,消费者阅读jms.prefetchPolicy.queuePrefetch = 1& wireFormat.maxInactivityDuration = 50000

一旦消费者处理了一条消息,它就会收到消息。

如果消费者阅读消息,并且在它发送确认消息之前,该过程突然终止,ActiveMq会发生什么? (这里有什么ActiveMq参数?)

如果消费者需要花费10分钟来处理消息(因此消费者任务还活着并且正常工作),那么它有何不同?ActiveMq如何知道消息仍在处理中? (它是否监视TCP / IP连接,如果连接中断,它会认为该消息不是Ack')

我如何确定某条消息是否是毒药",即它会让消费者崩溃? (如果消费者任务没有消失,重新传递计数似乎是有效的;消息中是否有一个内部计数器表示"它被读了n次而没有被成功地确认?")

作为一项实验,我发了6条消息,其中一封是毒药#34; (在消费者可以发送确认之前杀死消费者),同时有2个消费者在运行(并且每当消费者死亡时自动重新启动消费者以将计数带到2)。查看队列(使用jconsole,我使用broker.setUseJmx(true)启用jmx),传递了4条消息,2条正在传输。为什么会有2个在飞行而不是只有一个?

我一直在阅读ActiveMq和JMS规范一段时间没有明确/确定的答案,因此任何有关参数发挥作用的见解,以及是否存在任何已知错误都将非常有用。

1 个答案:

答案 0 :(得分:4)

这完全基于我对JMS的理解 - 可能不完全正确:

如果消费者阅读消息,并且在发送消息之前,该过程突然终止,ActiveMq中会发生什么

我的理解是,由于这发生在与JMS提供程序的会话的上下文中,因此JMS提供程序知道会话是否不再处于活动状态或已失败,并且会话中未确认任何未确认的消息将在会话中重新传递重建。

如何确定邮件是否是“毒药”,即它会让消费者崩溃?

正如您所提到的,JMS提供程序会在消息标题中跟踪重新传递消息的次数

发送了4封邮件,其中2封正在发送

不确定这一点