Camel 如何使应用程序的一个示例只接收每个AMQP主题消息(消费者组行为)

nuypyhwy  于 2022-11-07  发布在  Apache
关注(0)|答案(1)|浏览(124)

我正在使用Apache Camel's AMQP组件监听来自ActiveMQ Artemis主题的消息。
此应用程序在具有两个副本的Kubernetes上运行。
我已经配置了一个长期订阅,每个单元都有一个唯一的clientId和一个通用订阅名称:

<route autoStartup=true" id="myRoute">
    <from id="_amqp_topic" uri="amqp:topic:xxx?connectionFactory=#amqpCF&amp;disableReplyTo=true&amp;transacted=false&amp;subscriptionDurable=true&amp;clientId={{container-id}}&amp;durableSubscriptionName=eventSubscription"/>
    <log loggingLevel="INFO" message="Received event: ${body}"/>
    ...
</route>

问题是两个pod都接收到消息,而只有其中一个应该接收。我试图实现类似于Kafka's consumer groups的东西,其中只有组中的一个成员接收每个消息。

eqqqjvef

eqqqjvef1#

如果您希望只有一个订户接收消息,则订户必须 * 共享 * 同一订阅。因此,您需要:

  • 在您的_amqp_topicuri中设置subscriptionShared=true
  • 使用 * 相同 * 的客户端ID(即,不使用{{container-id}}

例如:

<route autoStartup=true" id="myRoute">
    <from id="_amqp_topic" uri="amqp:topic:xxx?connectionFactory=#amqpCF&amp;disableReplyTo=true&amp;transacted=false&amp;subscriptionDurable=true&amp;clientId=myClientID&amp;durableSubscriptionName=eventSubscription&amp;subscriptionShared=true"/>
    <log loggingLevel="INFO" message="Received event: ${body}"/>
    ...
</route>

另一种选择是简单地使用队列而不是主题,例如:

<route autoStartup=true" id="myRoute">
    <from id="_amqp_queue" uri="amqp:queue:xxx?connectionFactory=#amqpCF&amp;disableReplyTo=true&amp;transacted=false"/>
    <log loggingLevel="INFO" message="Received event: ${body}"/>
    ...
</route>

相关问题