ActiveMQ:如何将同一组消息发送到一个使用者线程

问题描述 投票:0回答:1

我们在项目中使用ActiveMQ,我们要求一组属于一组的消息应由一个消费者使用线程。

例如,我们有3条(M1,M2,M3)消息属于人A,3条(M4,M5,M6)消息属于人B。

我们的要求是:所有消息属于A人,消费者线程1,所有属于个人B的消息都应由使用者线程2。

基于ActiveMQ文档,根据我们的理解,我们使用了ActiveMQ中的JMXGroupId概念。例如,我们将JMSXGroupId设置为属于个人A的所有消息(M1,M2,M3)为123,所有消息为234属于人B的消息(M4,M5,M6)。

在某些情况下,使用JMXGroupId时,属于个人A和B(M1,M2,M3,M4,M5和M6)的所有消息都将进入同一使用者线程1。但是在我们的要求中,它应该去两个不同的线程线程。

mule activemq mulesoft
1个回答
0
投票

[看起来该主题已经在ActiveMQ用户邮件列表中为discussed before。讨论结果为this issue,看来该问题的解决方案涉及发送具有JMSXGroupSeq属性且其值为-1的消息。正如吉拉说:

现在,由于组负载是用户优先级的一部分,所以重新平衡的关键是使用负序号属性进行的周期性组终止。 message.setIntProperty(“ JMSXGroupSeq”,-1);

[不幸的是,此实现似乎有问题,总结在this issue中。该问题是在2010年末(即现在的10年前)报告的,此后似乎没有采取任何措施来解决此问题。

因此,我为您提供了三种不同的选择:

  1. 自己解决ActiveMQ code-base中的问题。这是开源软件的巨大优势之一-您可以修复错误并实现自己需要的功能,而无需等待其他任何人。
  2. 移至ActiveMQ Artemis,它已经支持the documentation中所述的功能。 ActiveMQ Artemis是ActiveMQ的下一代代理,当达到足够的功能奇偶校验时,将成为ActiveMQ 6。 ActiveMQ Artemis支持与ActiveMQ 5.x相同的所有协议,因此您无需更改任何客户端。
  3. 沟渠消息分组,只需在使用者上使用选择器。例如,属于人1的每条消息都可以具有名为personIndex的属性,其值为1,应该接收这些消息的使用者可以使用诸如personIndex = 1的选择器,然后,属于人2的每条消息都可以具有名为personIndex且值为2的属性,应该接收这些消息的使用者可以使用personIndex = 2这样的选择器。
© www.soinside.com 2019 - 2024. All rights reserved.