1

有人可以在经纪人网络的背景下澄清 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 文档有点过时了。有人可以确认或反驳吗?

提前致谢!

4

1 回答 1

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

于 2013-06-04T04:25:32.660 回答