6

我有两个配置为存储转发网络的 ActiveMQ 代理(A 和 B)。当有一个消费者连接在代理 B 上并且生产者向 A 发送消息时,它们可以完美地将消息从 A 转发到 B。问题是,当消费者被杀死并重新连接到 A 时,B 上的排队消息(它们是从A)不会转发回消费者连接的A。即使我向 B 发送新消息,所有消息都停留在 B 上,直到我重新启动代理。我尝试在代理网络连接器上设置 networkTTL="4" 和 duplex="true",但它不起作用。

4

2 回答 2

7

迟到的答案,但希望这会在未来对其他人有所帮助。

消息卡在 B 中是因为默认情况下 AMQ 不允许将消息发送回之前已传递到的代理。在正常情况下,这可以防止消息在类似网格的网络拓扑中循环而不被传递,但在故障转移情况下,它会导致消息卡在一个代理上并且无法到达所有消费者所在的代理。

如果当前代理因为没有消费者连接而处于死胡同,要允许消息返回到代理,您应该使用 replayWhenNoConsumers=true 来允许将卡在 B 上的消息转发回 A。

http://activemq.apache.org/networks-of的“Stuck Messages (version 5.6)”部分描述了该配置选项、您可能希望与其结合使用的一些设置以及使用它时的一些注意事项-brokers.htmlhttp://tmielke.blogspot.de/2012/03/i-have-messages-on-queue-but-they-dont.htmlhttps://issues.apache.org/jira/浏览/AMQ-4465。确保您可以忍受这些更改的副作用(例如,跨代理到代理网络连接的其他消息的重复消息传递的可能性)。

于 2014-09-16T20:25:35.807 回答
1

您能否提供有关代理 A 和 B 的配置的更多信息,以及您要实现的目标?

在我看来,您可以通过设置代理网络(带有 A 和 B)来实现您想要的,生产者只连接到一个,消费者连接到另一个。只要另一个代理对消息发送到的目的地有有效订阅,消息就会自动传输到另一个代理。

如果您不确定它产生的后果(它往往会导致不需要的消息循环),我不建议您更改 networkTTL。

于 2013-03-22T06:47:11.407 回答