【发布时间】:2013-05-29 14:19:15
【问题描述】:
有人可以在代理网络的上下文中澄清 activemq 虚拟主题的行为吗? 我对订阅传播感到困惑。
例如,有一个代理与另一个代理具有网络连接器。假设代理 mq001 向代理 mq002 开放了以下网络连接器:
<networkConnectors>
<networkConnector name="connectorToRemoteBroker" uri="static:(tcp://mq002:61616)?maxReconnectAttempts=0" duplex="false" networkTTL="3" decreaseNetworkConsumerPriority="true">
</networkConnectors>
然后我将消费者 (A) 运行到代理 mq001 上的虚拟主题:
端点URI: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 文档有点过时了。有人可以确认或反驳吗?
提前致谢!
【问题讨论】: