更改activemq版本导致的topic clientid 连接不上

 背景: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 的使用异常。老版本正常使用,不是很明白改了什么


​​​​​​​​​​​​​​
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值