【问题标题】:How to create separate queue for each consumer I have in activemq?如何为我在activemq中的每个消费者创建单独的队列?
【发布时间】:2017-07-02 19:16:10
【问题描述】:

我正在使用 activemq(对我来说很新),我有一个生产者和几个消费者。

问题是,我想为特定消费者处理消息。 我阅读了有关 selectors 的信息,但也阅读了 it is a bad practice 以供使用,还阅读了一些 alternatives

替代方案对我来说听起来不错,但我不确定如何为我的每个奴隶创建这些队列。 我的每个奴隶都有一个 ID (uuid),我可以在创建侦听器时使用它 - 就像这样:

<jms:listener-container
        container-type="default"
        connection-factory="jmsConnectionFactory"
        acknowledge="auto">
    <jms:listener destination="slave.tasks.${slave.id}" ref="jmsActivityListener" method="onMessage" />
</jms:listener-container>

这需要 slave.properties 文件包含以下条目:

slave.id=XXXXXXX

我的问题是:

1) 是这样做的吗(为每个消费者定义一个队列)?

2) 如何生成这个 salve.id 值(我不希望用户填写它,因为它必须是唯一的)?

谢谢

【问题讨论】:

    标签: java spring jms activemq


    【解决方案1】:

    虚拟主题救援

    虚拟主题背后的想法是生产者以通常的 JMS 方式发送到主题。消费者可以继续使用 JMS 规范中的主题语义。但是,如果主题是虚拟的,消费者可以从物理队列中消费逻辑主题订阅,从而允许许多消费者在许多机器和线程上运行以平衡负载。 例如,假设我们有一个名为 VirtualTopic.Orders 的主题。 (前缀 VirtualTopic. 表示它是一个虚拟主题)。从逻辑上讲,我们希望向系统 A 和 B 发送订单。现在,对于常规的持久主题,我们将为 clientID_A 和“A”以及 clientID_B 和“B”创建一个 JMS 消费者。 有了虚拟主题,我们可以直接消费到队列 Consumer.A.VirtualTopic.Orders 成为系统 A 的消费者或消费到 Consumer.B.VirtualTopic.Orders 成为系统 B 的消费者。 我们现在可以为每个系统创建一个消费者池,然后它们会竞争系统 A 或 B 的消息,这样系统 A 的所有消息都只处理一次,系统 B 的消息也类似。

    http://activemq.apache.org/virtual-destinations.html

    <jms:listener-container
            container-type="default"
            connection-factory="jmsConnectionFactory"
            acknowledge="auto">
        <jms:listener destination="Consumer.#{T(java.lang.System).currentTimeMillis()}.VirtualTopic.tasks" ref="jmsActivityListener" method="onMessage" />
    </jms:listener-container>
    

    您的生产者可以向主题"VirtualTopic.tasks" 发送消息,这些消息将发送到所有Consumer.*.VirtualTopic.tasks 队列

    【讨论】:

    • 感谢您的回复,但我认为这不会解决我的问题 - 因为我想向特定的消费者(不是所有消费者)发送消息。如果我理解正确,这更像是一个我想避免的主题解决方案,因为消息必须发送给一个消费者(例如,100 个),所以我不想使用一个主题(除其他原因)
    • 如果您在 jmsConnectionFactory 中使用具有管理员角色的用户/密码,您的目的地将在运行时自动创建,但您需要找到将每个消费者映射到他们的 ID 的解决方案
    • 是的 - 我知道,我正在使用管理员凭据。但我需要一种方法来配置从属端的侦听器 - 就此而言,我需要知道不属于配置的 id(正如我在问题中提到的那样)
    • 您可以使用咨询activemq.apache.org/advisory-message.html 或 jmx 列出已创建或连接的消费者的队列,但是什么样的信息可以让您决定要将消息发送给哪个消费者??
    • 我的奴隶在发送信息给我的主人时——他们将他们的 ID 附加到这些对象上。当主设备希望在其中一个对象上执行任务时 - 它必须知道向哪个从设备处理该请求(这些对象上存在数据)
    猜你喜欢
    • 2018-12-22
    • 2016-11-14
    • 1970-01-01
    • 2018-03-14
    • 1970-01-01
    • 2014-06-27
    • 2018-12-18
    • 1970-01-01
    • 2012-08-11
    相关资源
    最近更新 更多