配置网络经纪人队列消费者从不成为本地主机除非经纪人失败

时间:2012-03-13 18:35:37

标签: jms activemq spring-jms

我有一对Broker配置为ActiveMQ 5.5.1的经纪人网络。每个代理都存在于通过WAN进行通信的服务器上。

ServerA上的BrokerA

<amq:broker useJmx="false" persistent="false">
    <amq:networkConnectors>
        <amq:networkConnector uri="static:(tcp://BrokerB:61616)" duplex="true" />
    </amq:networkConnectors>
    <amq:transportConnectors>
      <amq:transportConnector uri="tcp://BrokerA:61616" />
    </amq:transportConnectors>
</amq:broker>

ServerB上的BrokerB

<amq:broker useJmx="false" persistent="false">
    <amq:networkConnectors>
        <amq:networkConnector uri="static:(tcp://BrokerA:61616)" duplex="true" />
    </amq:networkConnectors>
    <amq:transportConnectors>
        <amq:transportConnector uri="tcp://BrokerB:61616" />
    </amq:transportConnectors>
</amq:broker>

在每台服务器上,我运行了一个Java服务,它创建了以下主题和队列:

<amq:queue id="myQueue" physicalName="myQueue" />
<amq:topic id="myTopic" physicalName="MyTopic" />

java服务(在每台服务器上)为 myQueue 创建生产者和消费者,为 myTopic 创建生产者和消费者。我希望 myTopic 上的两个消费者都能收到所有主题消息。问题在于 myQueue 。我只希望配置的 代理消耗 myQueue 消息。例如,如果BrokerA在ServerA上生成服务消息,我只希望ServerB上的BrokerB使用该消息。现在,在我的测试中,我看到BrokerA消耗的ServerA上产生的消息占50%,BrokerB消耗的消息占50%。此外,如果BrokerB脱机,BrokerA必须接受来自ServerA和ServerB的所有 myQueue 消息,并消耗所有 myQueue 消息,直到BrokerB重新联机。

我曾考虑使用消息组,但是我无法想出一种很好的方法来检测何时发生故障以切换发送消息的组。任何建议都将不胜感激!

1 个答案:

答案 0 :(得分:1)

你可以指定'excludedDestinations'来防止队列的消息转到其他经纪人......

<networkConnectors>
    <networkConnector uri="static:(tcp://BrokerB:61616)" duplex="true" >
        <excludedDestinations>
            <queue physicalName="myQueue"/>
        </excludedDestinations>
    </networkConnector>
</networkConnectors>

关于确保消费者'永远不会连接到本地代理,除非经纪人失败'的另一个问题......如果你在客户端连接中执行以下操作,你将始终连接到远程代理,除非它不可用...此外,当它可用时,您将恢复到远程代理

failover:(tcp://remoteBroker,tcp://localBroker)?randomize=false&priorityBackup=true