我有一个持久队列,非事务性,客户端确认,消费者使用 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 规范有一段时间了,但没有明确/确凿的答案,因此任何关于哪些参数起作用以及是否存在任何已知错误的见解都将非常有用。