我有关于重新发送邮件的问题。
设置如下:
两个AMQ实例AMQ1和AMQ2(版本5.10.0)以主/从配置(其中AMQ1为主)运行,两个消费者A和B从同一队列Q中获取。客户端配置为使用ActiveMQSession.INDIVIDUAL_ACKNOWLEDGE它们处于循环获取(拉模式)消息中,没有确认任何消息。
测试用例:
现在,发生了两件事之一:
a)消费者A再次收到消息,导致消息被放入死信队列。 b)消费者B收到消息,现在A和B都有相同的消息。
在a)我面临的问题是,如果A崩溃,则消息丢失。在b)问题是现在两个消费者对同一个消息采取行动。
是否可以将AMQ配置为以某种方式跟踪重新连接消费者的情况,因此如果发现消息已经存在于某个消费者处,它将不会重新发送消息?至少在a)中应该有办法避免将消息放入DLQ中?
谢谢!
答案 0 :(得分:1)
我不相信有一种方法可以配置ActiveMQ重新发送消息,如果客户端重新连接,因为客户端重新启动但不是代理重新启动或故障转移。您最好的选择可能是在您的客户端保留您已处理但未获得的任何消息的JMSMessageID,因此您可以在第二次到达时忽略重复项,这将解决A中的问题。
您可以使用message groups来确保消息始终发送给同一个消费者(防止方案B),但我自己从未使用过它们,所以我不确定它们是否适用于故障转移方案中的两个代理。但如果您认为它可能有所帮助,那么这将是一个简单的测试。