ActiveMQ靜態網絡連接

前言

使用靜態網絡連接(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)”。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章