Java 跨多个队列的ActiveMQ消息组使用者选择?

Java 跨多个队列的ActiveMQ消息组使用者选择?,java,jms,activemq,message-queue,mom,Java,Jms,Activemq,Message Queue,Mom,是跨多个使用者进行负载平衡的一个极好的功能。简而言之:消息流根据消息中嵌入的组标识符(JMSXGroupID)跨单个队列的多个使用者进行分区。(因此,使用者1将获得JMSXGroupID=a的所有消息,使用者2将获得JMSXGroupID=b的所有消息,依此类推。) 现在,假设您有两个队列:A和B,并假设在流经这两个队列的消息中使用了一致的JMSXGroupIDs分类法。代理为队列A上的JMSXGroupID=ABC选择的消费者是否与代理为队列B上的JMSXGroupID=ABC选择的消费者来自

是跨多个使用者进行负载平衡的一个极好的功能。简而言之:消息流根据消息中嵌入的组标识符(
JMSXGroupID
)跨单个队列的多个使用者进行分区。(因此,使用者1将获得
JMSXGroupID=a
的所有消息,使用者2将获得
JMSXGroupID=b
的所有消息,依此类推。)

现在,假设您有两个队列:
A
B
,并假设在流经这两个队列的消息中使用了一致的
JMSXGroupID
s分类法。代理为队列
A
上的
JMSXGroupID=ABC
选择的消费者是否与代理为队列
B
上的
JMSXGroupID=ABC
选择的消费者来自同一连接

我怀疑我所问问题的答案是“否”。有太多的变量在起作用:如果经纪人为
A
选择的消费者没有相应的
B
消费者,会发生什么?如果代理为
A
选择的消费者为
B
选择了多个对应的消费者,会发生什么情况?在这些情况下,没有明显的正确答案

然而,我们可以模拟这种行为吗?例如,a上的消费者可能是一个可行的解决方案--确保
a
B
上的所有消费者都在复合目的地
a、B
上消费,并且您可能正在经营业务--但ActiveMQ似乎不支持从复合目的地消费

我找到的唯一解决方案就是在一个队列上推送
A
B
的消息——称之为
AB
——并在该队列上拥有一个独家消费者。您现在必须区分“
A
messages”和“
B
messages”,但您可以很容易地用标题来区分


然而,这个解决方案闻起来很有趣。(您现在必须假设制作人会尽职尽责地将特殊头应用于他们的消息,或修改您的有效负载。)是否有一种解决方案可以确保跨越两个单独队列
a
B
的消费者始终位于同一连接上?

正如您正确计算的那样,消息组仅适用于单个队列。多个队列之间没有协调

通常,当您使用消息组时,您试图保证消息的顺序,不仅是传递,而且是处理——因此,特定实体的所有事件都是按顺序处理的。问题总是在于用例的细节,但将所有相关消息放在一个队列中会得到您想要的结果。为了以不同的方式处理它们,您需要将某种多路复用逻辑放入您的消费者中,以便根据消息有效负载做出决定—正如您所说,一个众所周知的报头是解决方案的一个很好的候选

要绕过确保客户机显式设置的先决条件,您可以编写一段代表您执行此操作的驼峰路由逻辑-这只有在添加到ActiveMQ 5.9的情况下才可能实现。这样做的目的是让制片人看到两个独立的队列——A和B;当消息放入时,路由逻辑将从这些队列中读取,适当地设置头,然后将它们重新路由到C。路由逻辑实际上是一个拦截器

<route id="ConflateA">
  <from uri="broker:queue:A"/>
  <setHeader headerName="OriginalMessageSource">
    <constant>A</constant>
  </setHeader>
  <to uri="broker:queue:C"/>
</route>

A.
然后,您可以在多路复用逻辑中使用
OriginalMessageSource