斷線重連機制是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,都是可以自動重連的。