首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

ActiveMQ 空閒超時斷連與客戶端重連機制設計

     編輯:程式設計綜合問答

現象:ActiveMQ 日志出現 `Idle timeout` 警告,連接被服務端主動關閉,客戶端需自動重連。

服務端超時配置

`activemq.xml` 中 `` 的屬性:

<transportConnector name="openwire" 
    uri="tcp://0.0.0.0:61616?maximumInactivityDuration=30000&wireFormat.maxInactivityDuration=30000" />
  • `maximumInactivityDuration`:Broker 端判定閒置超時毫秒數,默認 30000ms。
  • `wireFormat.maxInactivityDuration`:客戶端發送心跳間隔,**必須 ≤ 服務端值**,否則心跳來不及發送就被斷開。

客戶端重連配置

Spring JMS (DefaultMessageListenerContainer)

@Bean
public DefaultMessageListenerContainer container(ConnectionFactory cf) {
    var container = new DefaultMessageListenerContainer();
    container.setConnectionFactory(cf);
    container.setDestinationName("queue.test");
    container.setMessageListener(msg -> { /* 處理 */ });
    container.setRecoveryInterval(5000L); // 重連間隔 5秒
    container.setCacheLevel(CACHE_CONSUMER); // 緩存 Consumer,重連後復用
    return container;
}

ActiveMQ ConnectionFactory 級別

var cf = new ActiveMQConnectionFactory(
    "failover:(tcp://host1:61616,tcp://host2:61616)" +
    "?initialReconnectDelay=1000" +           // 首次重連延遲 1秒
    "&maxReconnectDelay=30000" +              // 最大延遲 30秒
    "&useExponentialBackOff=true" +           // 指數退避
    "&randomize=false" +                      // 固定順序嘗試
    "&timeout=-1"                             // 無限重試
);
cf.setRedeliveryPolicy(new RedeliveryPolicy() {{
    setMaximumRedeliveries(6);                // 消息重試 6次
    setInitialRedeliveryDelay(1000L);
    setBackOffMultiplier(2);
}});

心跳機制深度解析

  • OpenWire 協議:Broker 每 `maximumInactivityDuration/2` 發送 `KeepAliveInfo`,客戶端必須在 `maximumInactivityDuration` 內響應。
  • 若網絡抖動導致心跳丟失,Broker 直接關閉 Socket,**不發送異常通知** 給客戶端(客戶端讀取返回 -1 才知斷開)。
  • 因此客戶端**必須啟用 `failover:` 協議**,由內部守護線程檢測連接斷開並自動重連。

監控與告警建議

  • 導出 JMX 指標:`CurrentConnections`、`TotalConnections`、`EnqueueCount`、`DequeueCount`。
  • Prometheus + JMX Exporter 抓取,Grafana 設置告警:`rate(activemq_connections_closed_total[5m]) > 0.1` 觸發報警。
  • 日志關鍵字:`WARN | Transport Connection to: tcp://... failed` 記錄斷開堆棧。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved