有人可以在经纪人网络的背景下澄清 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)中也终于有了可用的主题。
所以每个消费者只消费了一条消息。如果我用更多的消息重复它,它仍然可以正常工作。没有重复到达,也没有丢失的消息。每个物理队列上的排队消息数与虚拟主题上的数相匹配。
在经纪人网络的情况下,这正是我对虚拟主题所期望的行为。
但现在我困惑的根源:
如果您使用默认网络配置,您可能会收到重复的消息。这是因为网络节点不仅会转发发送到虚拟主题的消息,还会转发相关的物理队列。
首先,我没有看到任何重复,而且效果很好。但是,如果我遵循建议并禁用物理队列目标会发生什么?
<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 文档有点过时了。有人可以确认或反驳吗?
提前致谢!