解决spring-integration-mqtt频繁报Lost connection错误问题

 更新时间:2023年03月11日 11:00:22   作者:VictorBu  
这篇文章主要介绍了解决spring-integration-mqtt频繁报Lost connection错误问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

问题描述

在之前的博客介绍了如何在 Spring Boot 集成 MQTT,后面使用中没有发现问题,最近发现一直报错:

Lost connection: Connection lost; retrying...
Lost connection: 已断开连接; retrying...

解决过程

网上说是因为 client ID 重复,最开始是不相信的,因为我测试只启动了一个客户端。但是却怎么都定位不到异常原因,用重新回到 client ID 重复的这个思路上来:

因为程序里同时作为订阅者和发布者,就怀疑订阅和发布服务是不是单独建立的连接,抱着试试看的想法试了一下,结果果然是这个原因

原代码:

    /* 发布者 */
    @Bean
    @ServiceActivator(inputChannel = OUTBOUND_CHANNEL)
    public MessageHandler getMqttProducer() {
        MqttPahoMessageHandler messageHandler = new MqttPahoMessageHandler(clientId, getMqttClientFactory());
        messageHandler.setAsync(true);
        messageHandler.setDefaultTopic(defaultTopic);
        messageHandler.setDefaultRetained(defaultRetained);
        messageHandler.setDefaultQos(defaultProducerQos);

        return messageHandler;
    }

    /* 订阅者 */
    @Bean
    public MessageProducer getMqttConsumer() {
        MqttPahoMessageDrivenChannelAdapter adapter =
                new MqttPahoMessageDrivenChannelAdapter(clientId, getMqttClientFactory(), consumerTopics);
        adapter.setCompletionTimeout(completionTimeout);
        adapter.setConverter(new DefaultPahoMessageConverter());
        adapter.setQos(defaultConsumerQos);
        adapter.setOutputChannel(inboundChannel());

        return adapter;
    }

订阅者和发布者使用的是相同的 client ID,修改后代码:

    /* 发布者 */
    @Bean
    @ServiceActivator(inputChannel = OUTBOUND_CHANNEL)
    public MessageHandler getMqttProducer() {
        MqttPahoMessageHandler messageHandler = new MqttPahoMessageHandler(clientId + "_producer", getMqttClientFactory());
        messageHandler.setAsync(true);
        messageHandler.setDefaultTopic(defaultTopic);
        messageHandler.setDefaultRetained(defaultRetained);
        messageHandler.setDefaultQos(defaultProducerQos);

        return messageHandler;
    }

    /* 订阅者 */
    @Bean
    public MessageProducer getMqttConsumer() {
        MqttPahoMessageDrivenChannelAdapter adapter =
                new MqttPahoMessageDrivenChannelAdapter(clientId + "_consumer", getMqttClientFactory(), consumerTopics);
        adapter.setCompletionTimeout(completionTimeout);
        adapter.setConverter(new DefaultPahoMessageConverter());
        adapter.setQos(defaultConsumerQos);
        adapter.setOutputChannel(inboundChannel());

        return adapter;
    }

总结

虽然目前解决了这个问题,但是为什么会单独建立两个连接的原因还未找到;另外,一个程序两个连接还是感觉怪怪的,不知道还有没有更优的处理方案。

希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • MyBatis快速入门之环境搭建和单表映射

    MyBatis快速入门之环境搭建和单表映射

    一说起对象关系映射框架,大家第一时间想到的肯定是Hibernate。Hibernate作为一个著名的框架,功能十分强大。但是由于Hibernate如此强大的功能,导致了它的缺点。好吧,不多说了,具体详情大家通过本文一起学习吧
    2017-03-03
  • javaweb中Http协议详解

    javaweb中Http协议详解

    HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程。这篇文章主要为大家详细介绍了javaweb中的Http协议,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • RocketMQ消息拉取过程详解

    RocketMQ消息拉取过程详解

    这篇文章主要为大家介绍了RocketMQ消息拉取过程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • Java中的RocketMQ消费幂等详解

    Java中的RocketMQ消费幂等详解

    这篇文章主要介绍了Java中的RocketMQ消费幂等详解,当出现消费者对某条消息重复消费的情况时,重复消费的结果与消费一次的结果是相同的,并且多次消费并未对业务系统业务产生任何负面影响,那么这个消费过程就是消息幂等,需要的朋友可以参考下
    2023-10-10
  • 全网最全最细的jmeter接口测试教程以及接口测试流程(入门教程)

    全网最全最细的jmeter接口测试教程以及接口测试流程(入门教程)

    本文主要介绍了全网最全最细的jmeter接口测试教程以及接口测试流程,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • idea如何设置Git忽略对某些文件或文件夹的版本追踪

    idea如何设置Git忽略对某些文件或文件夹的版本追踪

    这篇文章主要介绍了idea如何设置Git忽略对某些文件或文件夹的版本追踪问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • 一次java异步任务的实战记录

    一次java异步任务的实战记录

    最近做项目的时候遇到了一个小问题,从前台提交到服务端A,A调用服务端B处理超时,下面这篇文章主要给大家介绍了一次java异步任务的实战记录,需要的朋友可以参考下
    2022-05-05
  • spring boot使用sonarqube来检查技术债务

    spring boot使用sonarqube来检查技术债务

    今天小编就为大家分享一篇关于spring boot使用sonarqube来检查技术债务,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • 使用jpa原生sql@Query操作增删改查

    使用jpa原生sql@Query操作增删改查

    这篇文章主要介绍了使用jpa原生sql@Query操作增删改查,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • 为什么rest接口返回json建议采用下划线形式,不要用驼峰

    为什么rest接口返回json建议采用下划线形式,不要用驼峰

    为什么rest接口返回json建议采用下划线形式,不要用驼峰?今天小编就来为大家说明一下原因,还等什么?一起跟随小编过来看看吧
    2020-09-09

最新评论