2013-03-20 36 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。