ActiveMQ的斷線重連機制

來源:互聯網
上載者:User

斷線重連機制是ActiveMQ的高可用性具體體現之一。

具體就是使用failover方式,使得串連斷開之後,可以不斷的重試串連到一個或多個brokerURL。

例如:failover:(tcp://127.0.0.1:61616) ,這裡可以使用多個url。

預設情況下,如果client與broker直接的connection斷開,則client會新起一個線程,

不斷的從url參數中擷取一個url來重試串連。

這個機制對於在容器中使用的connection木有問題。

activemq-core源碼的test中也有多個client與broker之間斷開重連10次的例子:

http://svn.apache.org/repos/asf/activemq/trunk/activemq-core/src/test/java/org/apache/activemq/transport/failover/ReconnectTest.java

但是對於簡單實現的一個獨立運行client,一般重連一次就會出現進程退出的bug:https://issues.apache.org/jira/browse/AMQ-796

可以測試如下:

1、通過命令列啟動一個broker

2、在java中建立一個connection,添加一個TransportListener,使用如下代碼來根據串連斷開與重連。

@Override
public void transportInterupted() {
System.out.println("===>> 斷開");
}
@Override
public void transportResumed() {
System.out.println("===>> 重連");
}

3、運行程式

4、停止broker,再啟動broker

5、觀察到斷開與重連

6、再停止broker,發現程式自動結束。


程式退出不再重連的原因在於重連的線程是daemon的,串連出錯以後,其他線程都退出了,這個線程也隨即被銷毀掉了。

官方修複過一次,在ActiveMQ Connection Executor上設定了daemon=false,但是這個線程不一定被建立出來。所以bug依然在。

修複的方法很簡單:

FailoverTransport.java 的132 行
reconnectTaskFactory = new TaskRunnerFactory();
reconnectTaskFactory.setDaemon(false); // to set daemon=false by kimmking
reconnectTaskFactory.init();

把重連的線程設定成daemon=false就成。

然後再按照上面的步驟來執行,發現多次重啟broker,都是可以自動重連的。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.