【发布时间】:2014-12-15 07:34:35
【问题描述】:
我有一个关于重新发送邮件的问题。
设置如下:
在主/从配置中运行的两个 AMQ 实例 AMQ1 和 AMQ2(版本 5.10.0)(其中 AMQ1 为主),两个消费者 A 和 B 从同一个队列 Q 中获取。客户端配置为使用 ActiveMQSession.INDIVIDUAL_ACKNOWLEDGE他们坐在一个循环中获取(拉模式)消息,没有确认任何消息。
测试用例:
- 向队列 Q 发送持久消息。
- 消息被 A 消费。
- 停止 AMQ1,从而启动 AMQ2。
现在,发生了两种情况之一:
a) 消费者 A 再次收到消息,导致消息被放入死信队列。 b) 消费者 B 收到消息,现在 A 和 B 都有相同的消息。
在 a) 中,我面临的问题是,如果 A 崩溃,消息就会丢失。在 b) 中,问题是现在两个消费者对同一条消息采取行动。
是否可以将 AMQ 配置为以某种方式跟踪重新连接的消费者,因此如果发现某个消费者已经存在消息,它就不会重新发送消息?至少在 a) 中应该有办法避免将消息放入 DLQ 中?
谢谢!
【问题讨论】:
-
您是否有理由等待确认您的消息?如果您不告诉代理您已经处理了该消息,它会在消息恢复时尝试重新传递该消息。我很惊讶您看到的行为 a),但 b) 对于您所描述的内容是非常符合预期的。
-
@Tim 我正在处理需要几分钟才能完成的消息。我最终会确认该消息,但在此处理期间重新启动 AMQ 将导致我的问题中描述的测试用例。
-
好的,从您的描述看来,您的消费者会在不确认第一个消息的情况下提取第二个(以及第三个、第四个等)消息。感谢您的澄清。
标签: activemq