我们在项目中使用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。但是在我们的要求中,它应该去两个不同的线程线程。
[看起来该主题已经在ActiveMQ用户邮件列表中为discussed before。讨论结果为this issue,看来该问题的解决方案涉及发送具有JMSXGroupSeq
属性且其值为-1
的消息。正如吉拉说:
现在,由于组负载是用户优先级的一部分,所以重新平衡的关键是使用负序号属性进行的周期性组终止。 message.setIntProperty(“ JMSXGroupSeq”,-1);
[不幸的是,此实现似乎有问题,总结在this issue中。该问题是在2010年末(即现在的10年前)报告的,此后似乎没有采取任何措施来解决此问题。
因此,我为您提供了三种不同的选择:
personIndex
的属性,其值为1
,应该接收这些消息的使用者可以使用诸如personIndex = 1
的选择器,然后,属于人2的每条消息都可以具有名为personIndex
且值为2
的属性,应该接收这些消息的使用者可以使用personIndex = 2
这样的选择器。