前言
使用靜態網絡連接(static networkConnector)可以將多個broker連接起來,作爲一個集羣對外提供服務。
我們假定有amq1和amq2配置了靜態網絡連接,那麼當一個消費者連接到amq2,當生產者發送消息到amq1時,amq2將會作爲amq1的一個消費者,將消息轉移到amq2,然後投遞給連接到amq2的消費者;反之亦然。對於queue,由於一條消息只能被一個消費者消費,所以在上面的情形下,消息將被轉移到amq2,然後投遞給連接到amq2的消費者;對於topic,amq2從amq1複製消息,然後投遞給消費者。
配置
這裏準備2臺activemq,這裏分別以activemq1和activemq2稱之。
activemq1修改
1.修改brokerName爲amq1;
2.修改openwire端口爲61616,其他的transportConnector刪除;
3.在destinationPolicy增加下面的配置
<policyEntry queue=">" enableAudit="false">
<networkBridgeFilterFactory>
<conditionalNetworkBridgeFilterFactory replayWhenNoConsumers="true"/>
</networkBridgeFilterFactory>
</policyEntry>
這是針對queue的配置。該配置是爲了解決消息迴流的問題。replayWhenNoConsumers=true表示沒有消費者時將消息迴流到原始的broker。enableAudit=false爲了防止消息迴流後被當做重複消息而不被分發。
activemq2修改
1.修改brokerName爲amq2,2個不要衝突。
2.修改openwire端口爲61617,其他的transportConnector刪除;
3.修改netty端口爲8162;
4.增加下面的配置
<networkConnectors>
<networkConnector name="bridge" uri="static:(tcp://localhost:61616)" duplex="true" conduitSubscriptions="false"/>
</networkConnectors>
duplex默認爲false,單向連接。如果配置爲false,那麼發送到amq2的消息可以從amq1消費,反之則不行。
conduitSubscriptions默認true,是否把同一個broker的多個consumer當做一個來處理。如果配置爲true,假定有1個消費者連接amq1,3個消費者連接amq2,那麼amq1的那個消費者將接收到50%的消息,amq2的3個消費者一共接收到50%的消息。所以這裏設置爲false,這樣假定發送100條消息,那麼每個消費者消費25條消息。
5.在destinationPolicy增加下面的配置
<policyEntry queue=">" enableAudit="false">
<networkBridgeFilterFactory>
<conditionalNetworkBridgeFilterFactory replayWhenNoConsumers="true"/>
</networkBridgeFilterFactory>
</policyEntry>
代碼
客戶端使用failover協議來連接mq。
failover:(tcp://127.0.0.1:61616,tcp://127.0.0.1:61626)?randomize=false
指定randomize爲false,這樣會先連接127.0.0.1:61616,連接不上纔會連接後面的地址。
測試
配置duplex=false,測試結果。
a.連接amq1發送消息;
[外鏈圖片轉存失敗(img-BmcdQjtf-1566178640426)(/img/activemq-broker-duplex-false-producer.png)]
b.消費者連接amq2接收消息
[外鏈圖片轉存失敗(img-JvyWiEmU-1566178640426)(/img/activemq-broker-duplex-false-consumer.png)]
可以發現發送到amq1的消息amq2沒法消費。
將duplex改爲true,amq2就可以消費amq1的消息了。
其他的就不一一測試了。
注意事項
q2沒法消費。
將duplex改爲true,amq2就可以消費amq1的消息了。
其他的就不一一測試了。
注意事項
這裏使用2個broker,實際可以根據需要配置多個。多個地址用逗號分隔即可。比如uri=“static:(tcp://localhost:61616,tcp://localhost:61636)”。