2014-10-20 81 views
1

我有关于重新传递邮件的问题。ActiveMQ和redelivery

的设置如下:

两个AMQ实例AMQ1和AMQ2(版本5.10.0)在主/从配置中运行(其中AMQ1是主站)和两个消费者A和B由相同的队列取出问:客户端被配置为使用ActiveMQSession.INDIVIDUAL_ACKNOWLEDGE,并且它们坐在循环提取(拉模式)消息中,没有确认任何消息。

测试用例:

  1. 发送持久消息到队列Q.
  2. 该消息由A.
  3. 停止AMQ1消耗,这带来了AMQ2。现在

,两种情况之一发生:

一)消费者再次接收到该消息导致该消息被放在死信队列。 b)消费者B收到消息,现在A和B都有相同的消息。

在a)我面对的问题是,如果A崩溃的消息丢失。在b)问题是,现在两个消费者采取相同的信息。

是否有可能配置AMQ以跟踪重新连接使用者,因此如果它发现它已经存在于某些消费者中,它不会重新发送消息?至少应该有a)的方法来避免将消息放入DLQ中?

谢谢!

+0

您是否有理由等待确认您的消息?如果你不告诉经纪人你已经处理了这封邮件,它将在邮件恢复时尝试重新发送邮件。我很惊讶你看到了行为a),但b)对你所描述的内容非常期待。 – Tim 2014-10-21 00:35:44

+1

@Tim我正在处理需要几分钟才能完成的消息。我将最终确认这个消息,但在此过程中重新启动AMQ将导致我的问题中描述的测试用例。 – garfen235 2014-10-21 08:07:20

+0

好的,根据你的描述,听起来好像你的消费者会在不承认第一条消息的情况下拉第二条(和第三条,第四条等)消息。感谢您的澄清。 – Tim 2014-10-21 15:49:45

回答

1

我不相信有一种方法可以配置ActiveMQ重新发送消息,如果客户端重新连接,因为客户端重新启动,但不是如果代理重新启动或故障转移。您最好的选择可能是坚持在您的客户端JMSMessageID为您已处理,但没有ack'ed任何消息,以便您可以忽略重复时,他们再次到达,这将解决问题在A中。

您可以使用message groups来确保邮件始终发送给同一个使用者(防止方案B),但我从来没有使用过它们,因此我不确定它们是否适用于故障转移场景中的两个代理。但如果你认为它可能会有所帮助,那么这将是一个简单的测试。