1

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

服务器 A 上的代理 A

<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>

服务器 B 上的代理 B

<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 使用该消息。现在,在我的测试中,我看到在 ServerA 上生成的消息中约有 50% 由 BrokerA 消耗,50% 由 BrokerB 消耗。此外,如果 BrokerB 离线,BrokerA 必须同时接受来自 ServerA 和 ServerB 的所有 myQueue 消息并使用所有myQueue消息,直到 BrokerB 重新在线。

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

4

1 回答 1

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
于 2012-03-15T03:09:59.803 回答