我使用activemq在不同进程之间传递请求。在某些情况下,我在队列中有多个重复的消息(它们是请求)。我想只有一个。有没有办法以一种方式发送消息,它将替换具有类似属性的旧消息?如果没有,是否有办法检查队列并检查具有特定属性的消息(在这种情况下,如果存在较旧的消息,我将不发送新消息。)
Clarrification(基于Dave的回答):我实际上是在尝试确保队列中没有任何重复的消息,以减少消费者收到消息时发生的处理量。因此,我想要替换一条消息,或者甚至不把它放在队列中。
感谢。
答案 0 :(得分:3)
这听起来像Idempotent Consumer的理想用例,可以从队列或主题中删除重复项。
以下示例显示了如何使用Apache Camel执行此操作,这是实现任何Enterprise Integration Patterns的最简单方法,特别是如果您使用的ActiveMQ comes with Camel integrated的方框
from("activemq:queueA").
idempotentConsumer(memoryMessageIdRepository(200)).
header("myHeader").
to("activemq:queueB");
唯一的技巧是确保有一种简单的方法来计算每条消息的唯一ID表达式 - 例如从文档中提取XPath或使用上面的示例中的一些唯一消息标题
答案 1 :(得分:1)
您可以浏览队列并使用选择器来识别邮件。但是,除非您收到少量消息,否则无法很好地扩展。相反,您的消息应该只是指向数据库记录(或记录集)的指针。这样您就可以更新记录,然后获得该消息的人将访问最新版本的记录。