2013-03-20 35 views
3

我有两个配置为存储转发网络的ActiveMQ代理(A和B)。当消费者在代理B上连接并且生产者向A发送消息时,他们完美地将消息从A转发到B.问题是,当消费者被终止并重新连接到A时,B上的排队消息(它们从A)不会转回到消费者连接到的A.即使我向B发送新消息,所有消息仍然停留在B,直到我重新启动代理。我试图在代理网络连接器上设置networkTTL =“4”和duplex =“true”,但它不起作用。ActiveMQ中间人网络不转发邮件

回答

3

迟到的答案,但希望这将有助于未来的其他人。

由于默认情况下AMQ不允许将消息发送回先前传送给它的代理,所以消息在B中卡住。在正常情况下,这可以防止消息在没有交付的情况下围绕网状网络拓扑进行周期性转换,但是在故障转移情况下,会导致消息停留在一个代理上,并且无法到达所有消费者所在的代理。

要允许消息返回到代理,如果当前代理因为没有消费者连接到它而死锁,则应该使用replayWhenNoConsumers = true允许转发B上卡住的消息返回A.

该配置选项,你可能想结合使用与它的一些设置,使用时的一些注意事项,在“卡住消息(5.6版)”中描述的http://activemq.apache.org/networks-of-brokers.htmlhttp://tmielke.blogspot.de/2012/03/i-have-messages-on-queue-but-they-dont.html,并https://issues.apache.org/jira/browse/AMQ-4465部分。确保您可以忍受这些更改的副作用(例如,可能会在代理与代理网络连接中重复传输其他消息)。

1

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

在我看来,通过设置经纪人网络(使用A和B),您可以实现您想要的目标,只有生产者连接到一个,消费者可以连接到另一个。 只要另一个代理具有对邮件发送到的目标的有效订阅,邮件就会自动传输到其他代理。

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