替换JMS队列中的消息

6
我正在使用activemq在不同的进程之间传递请求。在某些情况下,队列中存在多个重复的消息(即请求)。我希望只有一个。是否有一种方法可以发送一条消息以替换具有相似属性的旧消息?如果没有,是否有一种方法可以检查队列并查找具有特定属性的消息(在这种情况下,如果存在旧消息,则不会发送新消息)。
澄清一下(基于Dave的答案):实际上,我正在努力确保队列上没有重复的消息,以减少每当消费者获取消息时发生的处理量。因此,我要么想替换一条消息,要么根本不将其放入队列中。
谢谢。
2个回答

3
这似乎是使用幂等消费者的理想用例,它可以从队列或主题中删除重复项。
以下示例展示了如何使用Apache Camel来实现任何企业集成模式,特别是如果您正在使用ActiveMQ,则Camel已经预置在其中。请注意保留HTML标记。
from("activemq:queueA").
  idempotentConsumer(memoryMessageIdRepository(200)).
  header("myHeader").
  to("activemq:queueB");

唯一的技巧就是要确保在每个消息中有一种简单的方法来计算一个唯一的ID表达式 - 例如从文档中提取XPath或像上面的示例中使用一些唯一的消息头。


1

您可以浏览队列并使用选择器来识别消息。但是,除非您只有少量的消息,否则这种方法不会很好地扩展。相反,您的消息应该只是指向数据库记录(或一组记录)的指针。这样,您就可以更新记录,接收到消息的人将访问记录的最新版本。


谢谢Dave。实际上我正在努力确保队列中没有重复的消息,以减少消费者获取消息时发生的处理量。因此,我希望要么替换一条消息,要么根本不将其放入队列中。Udi - Udi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接