Activemq如何在经纪人网络中进行虚拟主题订阅传播?

时间:2013-06-03 12:22:50

标签: activemq broker jms-topic

有人可以在经纪人网络的背景下澄清activemq虚拟主题的行为吗? 我对订阅传播感到困惑。

例如,有一个代理具有到另一个的网络连接器。让我们说代理mq001有以下网络连接器对代理mq002开放:

<networkConnectors>
            <networkConnector name="connectorToRemoteBroker" uri="static:(tcp://mq002:61616)?maxReconnectAttempts=0" duplex="false"                networkTTL="3" decreaseNetworkConsumerPriority="true">
</networkConnectors>

然后我将消费者(A)运行到代理mq001上的虚拟主题:  endpointURI:activemq:Consumer.A.VirtualTopic.tempTopic

我可以在activemq控制台中注意到一些有趣的行为。首先,没有创建主题"VirtualTopic.tempTopic"。但是,有可用的队列(虚拟主题的基础物理队列) - Consumer.A.VirtualTopic.tempTopic 此队列有一个活跃的本地消费者。

然后我启动另一个消费者(B)到相同的虚拟主题,但已经在代理2(mq002)上。

endpointURI - activemq:Consumer.B.VirtualTopic.tempTopic

如果我现在看看代理2上的activemq控制台。我仍然没有看到任何可用的虚拟主题。还有另一个物理队列创建了Consumer.B.VirtualTopic.tempTopic,它有一个活动的消费者(也是mq002的本地消费者)。

当我看一下经纪人的控制台时,我现在看到两个队列:

Consumer.A.VirtualTopic.tempTopic - 具有活跃的本地消费者 Consumer.B.VirtualTopic.tempTopic - 具有活跃的远程消费者。

因此,订阅传播至少在物理队列级别上起作用。因为它不是双工,所以它只能从mq002到mq001。

然后我发布消息到主题:

 activemq:topic:VirtualTopic.tempTopic

消费者在mq001和mq002上消费它。此外,activemq控制台(VirtualTopic.tempTopic)中最终提供了主题。

因此每个消费者只消费一条消息。如果我用更多的消息重复它,它仍然可以正常工作。没有重复到达,也没有丢失的消息。每个物理队列上排队的消息数与虚拟主题上的数字匹配。

对于经纪人网络来说,这正是我对虚拟主题的期望。

但现在是我困惑的根源:

http://activemq.apache.org/virtual-destinations.html#VirtualDestinations-AvoidingDuplicateMessageinaNetworkofBrokers

  如果使用默认值,很可能会收到重复的消息   网络配置。这是因为网络节点不仅会   转发消息发送到虚拟主题,也是关联的   物理队列。

首先,我没有看到任何重复,而且效果很好。但是如果我按照建议并禁用物理队列目的地会发生什么?

<networkConnectors>
            <networkConnector name="connectorToRemoteBroker" uri="static:(tcp://mq002:61616)?maxReconnectAttempts=0" duplex="false" networkTTL="3" decreaseNetworkConsumerPriority="true">
                <excludedDestinations>
                        <queue physicalName="Consumer.*.VirtualTopic.>"/>
                </excludedDestinations>
          </networkConnector>
        </networkConnectors> 

然后当我启动消费者时,我再也看不到远程消费者在代理mq001上监听物理队列Consumer.B了。如果我向虚拟主题发布消息,那么它仅由Consumer.A(本地)使用。因此,虚拟主题看起来会忽略订阅传播,并且仅适用于物理队列。

它看起来像activemq文档有点过时了。有人可以证实或反驳吗?

提前致谢!

1 个答案:

答案 0 :(得分:2)

所以你的测试是正确的。 我刚刚更新了文档,指定在通过网络将传统主题订阅者和虚拟主题订阅者同时用于同一目标时,可以获取重复项。这意味着,在您的示例中,如果我在mq002上有一个主题订阅者“VirtualTopic.tempTopic”以及消费者排队“Consumer.B.VirtualTopic.tempTopic”,那么我最终可能会有重复。希望能够解决问题。如果您只使用基于队列的订户,则不要排除基于队列的需求转发。

我已经编写了一个单元测试,您可以在这里查看:

http://svn.apache.org/viewvc/activemq/trunk/activemq-unit-tests/src/test/java/org/apache/activemq/usecases/TwoBrokerVirtualTopicForwardingTest.java?view=markup