替换 jms 队列中的消息

Posted

技术标签:

【中文标题】替换 jms 队列中的消息【英文标题】:Replacing a message in a jms queue 【发布时间】:2010-09-19 02:08:58 【问题描述】:

我正在使用 activemq 在不同进程之间传递请求。在某些情况下,我在队列中有多个重复的消息(它们是请求)。我想只有一个。有没有办法发送一条消息,它将替换具有相似属性的旧消息?如果没有,有没有办法检查队列并检查具有特定属性的消息(在这种情况下,如果存在旧消息,我将不会发送新消息)。

澄清(基于戴夫的回答):我实际上是在尝试确保队列上没有任何重复的消息,以减少消费者收到消息时发生的处理量。因此,我想替换一条消息,甚至不将其放入队列中。

谢谢。

【问题讨论】:

【参考方案1】:

这听起来像是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 或使用上例中的一些唯一消息头

【讨论】:

【参考方案2】:

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

【讨论】:

谢谢戴夫。我实际上是在尝试确保队列上没有任何重复的消息,以减少消费者收到消息时发生的处理量。因此,我想替换一条消息,甚至不把它放在队列中。乌迪

以上是关于替换 jms 队列中的消息的主要内容,如果未能解决你的问题,请参考以下文章

如何替换 Jms Payment Paypal Bundle 中的文本

模拟或模拟消息队列 (JMS)

ActiveMQ(04):JMS的模型

Mule 请求者正在使用 JMS 队列中的所有消息

Spring JMS 和 ActiveMQ 在哪里查看死信队列中的消息

没有消息存储库的JMS队列的消息处理器