背景:activemq 服务端从5.10.2版本更换到5.16.5版本,导致使用activemq的部分部件的clientId连接失败,导致大量消息堆积
并且服务端使用了故障转移,报错日志也会一直打印
Transport (tcp://192.*.*.*:61616) failed, reason: java.io.EOFException, attempting to automatically reconnect
对比其中正常的部件和非正常的部件,差别就是使用了CachingConnectionFactory
其中正常部件A的topic监听配置:
@Bean(name = "topicListenerContainerFactoryForPartA")
public JmsListenerContainerFactory topicListenerContainerFactoryForPartA(ConnectionFactory connectionFactory) {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setSubscriptionDurable(true);
factory.setPubSubDomain(true);
factory.setClientId("PartA");
return factory;
}
异常部件B的topic监听配置:
@Bean(name = "topicListenerContainerFactoryForPartB")
public JmsListenerContainerFactory topicListenerContainerFactoryForPartB(DefaultJmsListenerContainerFactoryConfigurer configurer,
ActiveMQProperties properties) {
String clientID = "PartB";
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(properties.getBrokerUrl());
activeMQConnectionFactory.setClientID(clientID);
CachingConnectionFactory cachingConnectionFactory = new CachingConnectionFactory(activeMQConnectionFactory);
cachingConnectionFactory.setSessionCacheSize(10);
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setPubSubDomain(true);
factory.setSubscriptionDurable(true);
configurer.configure(factory, cachingConnectionFactory);
return factory;
}
使用CachingConnectionFactory异常的部件,重新更改新了clientId名称进行重新发布。监测到mq控制台新的clientId连接成功,新消息可以正常消费
CachingConnectionFactory (Spring Framework 4.3.9.RELEASE API)
CachingConnectionFactory 理解: 1:CachingConnectionFactory 默认情况下,只会缓存一个 Session(多负载部件易是如此) 2:既缓存生产者,又缓存消费者(当服务端切换机器时,由于缓存了生产者,会优先使用缓存服务器去连接,失败后,就是用故障转移配置的第二个url,就是为什么切换机器后,日志一直在打印failover:Transport (tcp://192.*.*.*:61616) failed, reason: java.io.EOFException, attempting to automatically reconnect) 3:从缓存的 Session 获得的 MessageConsumers 不会关闭,直到 Session 最终从池中删除(这就是为什么在未更新clientId之前,重新启动部件B依然会报错的原因,除非所有负载机器全部停止,但这会影响其他业务,没敢尝试,只有尝试更新clintId名称) 疑问点:为什么activemq服务器版本不同会导致CachingConnectionFactory 的使用异常。老版本正常使用,不是很明白改了什么