4

我有一个持久队列,非事务性,客户端确认,消费者使用 jms.prefetchPolicy.queuePrefetch=1&wireFormat.maxInactivityDuration=50000 读取

一旦消费者处理了一条消息,它就会确认该消息。

如果消费者读取了消息,并且在它可以发送 ack 之前,进程突然终止,那么 ActiveMq 中会发生什么?(什么 ActiveMq 参数在这里起作用?)

这与消费者需要 10 分钟来处理消息有什么不同(因此消费者任务是活动的并且正在工作),ActiveMq 如何知道消息仍在处理中?(它是否监视 TCP/IP 连接,如果连接断开,它会假定消息不会被确认?)

我如何确定一条消息是否是“毒丸”,即它使消费者崩溃?(如果消费者任务没有终止,重新传递计数似乎是有效的;消息中是否有一个内部计数器显示“它已被读取 n 次而没有成功确认?”)

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

我已经阅读 ActiveMq 和 JMS 规范有一段时间了,但没有明确/确凿的答案,因此任何关于哪些参数起作用以及是否存在任何已知错误的见解都将非常有用。

4

1 回答 1

4

这纯粹是基于我对 JMS 的理解——可能并不完全正确:

如果消费者读取了消息,并且在它可以发送 ack 之前,进程突然终止,ActiveMq 中会发生什么

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

我如何确定一条消息是否是“毒丸”,即它使消费者崩溃?

就像您提到的那样,JMS 提供程序会跟踪可能在消息头中重新传递消息的次数

4 条消息已发送,2 条正在发送中

不确定这一点

于 2012-06-29T01:40:37.107 回答