現象:ActiveMQ 日志出現 `Idle timeout` 警告,連接被服務端主動關閉,客戶端需自動重連。
`activemq.xml` 中 `
<transportConnector name="openwire"
uri="tcp://0.0.0.0:61616?maximumInactivityDuration=30000&wireFormat.maxInactivityDuration=30000" />
@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;
}
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);
}});