跨多个队列的ActiveMQ消息组消费者选择?

时间:2014-01-04 15:14:41

标签: java jms activemq message-queue mom

ActiveMQ Message Groups是一个精彩的功能,可以跨多个消费者实现负载平衡。简而言之:根据消息中嵌入的组标识符(JMSXGroupID),将消息流划分为单个队列的多个使用者。 (因此,消费者1将获得JMSXGroupID = a的所有消息,消费者2将获得JMSXGroupID = b的所有消息,依此类推。)

现在,假设您有2个队列:AB,并想象在流经两个队列的消息中使用JMSXGroupID s的一致分类。经纪人在队列JMSXGroupID = ABC上为A选择的消费者是否是来自经纪人在队列JMSXGroupID = ABC上选择B的同一连接的消费者?

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

但是,我们可以模拟这种行为吗?例如,composite destination上的消费者可能是一个可行的解决方案 - 确保AB上的所有消费者在合成目标A,B上消费,并且您可能在业务 - 但ActiveMQ似乎不支持从复合目的地消费。

我发现的唯一解决方案就是在一个队列中推送AB的消息 - 称之为AB - 并拥有一个独占消费者。您现在必须区分“A消息”和“B消息”,但您可以使用标题轻松完成此操作。

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

1 个答案:

答案 0 :(得分:1)

正确完成后,消息组仅应用于单个队列。多个队列之间没有协调。

通常,当您使用消息组时,您试图保证消息排序不仅仅是传递,而是处理 - 以便说明特定实体的所有事件都按顺序处理。恶魔始终在您的用例的详细信息中,但将所有相关消息放在一个队列中将为您提供您所追求的结果。为了以不同的方式处理它们,您需要将某种多路复用逻辑放入您的消费者中,以根据消息有效负载做出决策 - 如您所说的那样,一个众所周知的标头是解决方案的良好候选者。

为了解决确保客户明确设置此问题的先决条件,您可以做的是编写一个代表您执行此操作的Camel路由逻辑 - 这只能通过添加到broker: component的{{3}}来实现。 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>

然后,您可以在多路复用逻辑中使用OriginalMessageSource标头。