【问题标题】:ActiveMQ: How to resequence the messages in a queue with custom propertyActiveMQ:如何使用自定义属性对队列中的消息重新排序
【发布时间】:2020-06-13 11:50:30
【问题描述】:

我们在项目中使用 ActiveMQ,消息由不同的生产者同时写入到同一个队列中。因此,订单混乱。无论如何,消息可以在消费者消费之前在队列中重新排序

例如,生产者 A 生成消息 -> M1、M2、M3(自定义标头属性为 1、2、3) 生产者 B 生成消息 -> M4、M5、M6(自定义标头属性为 4、5、6)。

由于竞争条件,我们以 M1、M4、M5、M2、M3、M6 的形式将消息发送到队列。

我们能否使用自定义标头属性按所需顺序重新排序消息,例如:M1、M2、M3、M4、M5、M6?

注意:我们的项目中没有使用 Java。我们正在使用 Mulesoft 来生成和使用来自 ActiveMQ 的消息。

我见过this link,这与我们的问题类似,但是当我按照这些步骤操作时,链接中提供的解决方案不清楚或者无法正常工作。

【问题讨论】:

  • 首先是什么导致消息被发送出去或订购?
  • 另外,当您使用来自this answer 的解决方案时,什么不起作用?

标签: mule activemq mulesoft


【解决方案1】:

如果首先无法确保消息以正确的顺序发送,那么Camel's resequencer 是一个很好的解决方案。这是一个简单的例子:

<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
  <route>
    <from uri="activemq:queue:unordered"/>
    <resequence>
      <simple>in.header.seqnum</simple>
      <to uri="activemq:queue:ordered" />
      <stream-config capacity="5000" timeout="4000"/>
    </resequence>
  </route>
</camelContext>

这条路由会从unordered队列中读取消息,然后根据消息头seqnum重新排序,然后发送到ordered队列。因此,您的应用程序应该从ordered 队列中读取重新排序的消息。

Camel documentation 非常详尽,因此您应该参考它以获取更多详细信息。

【讨论】:

  • >> 我已经在另一篇文章中看到了这个解决方案,并在我最初的文章中分享了链接。当我按照这些步骤操作时它不起作用。
  • 这就是为什么我在上面的评论中问什么不起作用。你看到任何错误吗?您是否使用了正确的消息头(即我提供的示例中的seqnum)?如果您不解释它为什么/如何不起作用,您如何期望获得额外的帮助?
  • 对不起,贾斯汀不清楚。我已确保在我的 camel.xml 文件中添加了以下骆驼上下文。 camel.apache.org/schema/spring"> in.header.GroupID
  • 我还在 activemq.xml 文件中添加了 。当我现在向 SampleQ1 生成消息但我没有看到 SampleQ12 被创建并且消息被重新排序时。
  • 你把你的camel.xml放在哪里了?您如何将消息发送到SampleQ1?你能分享那个代码吗?
猜你喜欢
  • 2015-03-24
  • 2013-01-22
  • 2017-01-23
  • 2017-12-22
  • 1970-01-01
  • 2014-09-18
  • 1970-01-01
  • 2016-12-13
  • 1970-01-01
相关资源
最近更新 更多