解决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;
    }

总结

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

希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Android MQTT与WebSocket协议详细讲解

    目录 MQTT WebSocket 总结 MQTT MQTT是一个极其轻量级的发布/订阅消息传输协议,对于需要较小代码占用空间或网络带宽非常宝贵的远程连接非常有用 有如下特点: 开放消息协议,简单易实现: 发布订阅模式,一对多消息发布: 基于TCP/IP网络连接,提供有序,无损,双向连接: 1字节固定报头,2字节心跳报文,最小化传输开销和协议交换,有效减少网络流量: 消息QoS支持,可靠传输保证. 添加依赖 maven { url "https://repo.eclipse.org/conten

  • vue3+vite2+mqtt连接遇到的坑及解决

    目录 vue3+vite2+mqtt连接遇到的坑 vue3调用mqtt问题 总结 vue3+vite2+mqtt连接遇到的坑 从vue2版本整合到vue3版本遇到的坑,其实也是自己不够熟悉,哈哈 之前用vue2连接mqtt时是这样的方式 : 1.yarn add mqtt 或 npm install mqtt 2.import mqtt from 'mqtt' 安装完后直接在页面引用,就可以用了 所以在vue2项目里是比较简单的^_^ 但是,但可是,可但是 移到vue3就遇到各种报错了,Refe

  • 在Node.js下运用MQTT协议实现即时通讯及离线推送的方法

    前言 前些日子了解到mqtt这样一个协议,可以在web上达到即时通讯的效果,但网上并不能很方便地找到一篇目前版本的在node下正确实现这个协议的博客. 自己捣鼓了一段时间,理解不深刻,但也算是基本能够达到使用目的. 本文尚未对离线消息的接收顺序进行处理. 代码 服务端: server.js //服务端引入中间件mosca let mosca = require('mosca') let settings = { port: 5112 } let server = new mosca.Server

  • 使用java 实现mqtt两种常用方式

    目录 前言 Paho Java 库实现 spring boot集成mqtt 核心代码 总结 前言 在开发MQTT时有两种方式一种是使用Paho Java 原生库来完成,一种是使用spring boot 来完成. Paho Java 库实现 Eclipse Paho Java Client (opens new window)是用 Java 编写的 MQTT 客户端库(MQTT Java Client),可用于 JVM 或其他 Java 兼容平台(例如Android).Eclipse Paho J

  • vue3使用mqtt的示例代码

    目录 vue3使用mqtt 下面再看下vue3调用mqtt vue3使用mqtt 封装类 //封装一个类(可直接cv) class createds { //创建公共变量 static url; //mqtt地址 static oldSubscribe; //取消订阅准备 static subscribe; //订阅地址 static client; //mqtt公共变量 //接受床底来的数据 constructor(subscribe) { console.log(subscribe, "订阅

  • MQTT.js 入门使用教程

    目录 简介 安装 使用 npm 或 yarn 安装 使用 CDN 安装 全局安装 使用 简单例子 命令行 API 介绍 mqtt.connect([url], options) Client 事件 Client 方法 总结 简介 MQTT.js 是一个开源的 MQTT 协议的客户端库,使用 JavaScript 编写,主要用于 Node.js 和 浏览器环境中.是目前 JavaScript 生态中使用最为广泛的 MQTT 客户端库. MQTT 是一种基于发布/订阅模式的轻量级物联网消息传输协议,

  • VUE3+mqtt封装解决多页面使用需重复连接等问题(附实例)

    目录 场景: 一.安装mqtt 二.暴露出main.js中的vue实例 三.封装mqtt 四.编写mqtt配置文件 五.页面引入并使用 总结 场景: 在做的一个项目中多个页面都需要使用到mqtt接收消息,但这样的话每个页面就都需要连接一次mqtt,并且要再次配置options信息.订阅主题.接收消息,非常的不方便,因此琢磨将mqtt封装到vuex中,使其可以多页面通用,这样只需要连接订阅一次,接收到的消息可以存储在vuex中. mqtt在线测试工具:http://www.emqx.io/onli

  • 解决spring boot + jar打包部署tomcat 404错误问题

    1.spring boot 不支持jsp打jar包,jsp只能打war包. 方法: <packaging>war</packaging> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin

  • 解决spring mvc 返回json数据到ajax报错parseerror问题

    最近使用ajax接收spring mvc传过来的json数据时总是出现parseerror的错误,错误源码如下: 前端: $.ajax({ type: 'POST', url: "groupFunctionEdit", dataType: 'json', contentType: "application/json", data: JSON.stringify(functiondata), success: function(data){ alert('数据加载成功

  • 基于spring boot 日志(logback)报错的解决方式

    记录一次报错解决方法: No converter found capable of converting from type [java.lang.String] to type [java.util.Map<java.lang.String, java.lang.String>] org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'logging.le

  • spring配置文件解析失败报”cvc-elt.1: 找不到元素 ''beans'' 的声明”异常解决

    最近项目里面做了一个定时器,结果报错这个.网上的原因大多说是什么版本问题.我记录下我的问题所在. 由于项目启动在局域网,不能访问互联网. 打出来的jar包里面spring.schemas的文件有些奇怪. 居然是这样的. 我查看spring-beans的包发现并不是这个. spring的是这样的, 于是直接替换掉包里面的此文件. 项目正常启动. 至于为何打包之后变成ali的路径,现在还不知道原因. 总结 到此这篇关于spring配置文件解析失败报"cvc-elt.1: 找不到元素 'beans'

  • 解决Spring Boot 在localhost域奇怪的404问题(Mac book pro)

    在mac系统中,明明url是对的,浏览器也可以打开,一个简单的代码调用就是404,你有没有遇到过? 情景再现 普通的一个controller,返回一个常量. @GetMapping("/project_metadata/spring-boot") public String getMetadata(){ return "{\"data\":1234}";//这个不重要 } 调用接口的方式: content = new JSONObject(res

  • 解决spring中redistemplate不能用通配符keys查出相应Key的问题

    有个业务中需要删除某个前缀的所有Redis缓存,于是用RedisTemplate的keys方法先查出所有合适的key,再遍历删除. 但是在keys(patten+"*")时每次取出的都为空. 解决问题: spring中redis配置中,引入StringRedisTemplate而不是RedisTemplate,StringRedisTemplate本身继承自RedisTemplate, 即 <bean id="redisTemplate" class=&quo

  • Spring Boot MQTT Too many publishes in progress错误的解决方案

    目录 前言 原因分析 源码分析 MQTT的Push消息到缓存中时序图 MqttPahoMessageHandler的publish方法 MqttAsyncClient的publish方法 ClientComms的internalSend方法 ClientState的send方法 异步发送消息时序图 ClientComms的conncect方法 ConnectBG的run方法 CommsSender的run方法 CommsSender的notifySent方法 小结 解决方案 方案1:发送消息时设

  • 彻底解决Spring MVC中文乱码问题的方案

    乱码是让人很头疼的一件事,本文介绍了彻底解决Spring MVC中文乱码问题的方案,具体如下:  1:表单提交controller获得中文参数后乱码解决方案 注意:  jsp页面编码设置为UTF-8 form表单提交方式为必须为post,get方式下面spring编码过滤器不起效果 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <form

  • 解决Spring session(redis存储方式)监听导致创建大量redisMessageListenerContailner-X线程问题

    待解决的问题 Spring session(redis存储方式)监听导致创建大量redisMessageListenerContailner-X线程 解决办法 为spring session添加springSessionRedisTaskExecutor线程池. /** * 用于spring session,防止每次创建一个线程 * @return */ @Bean public ThreadPoolTaskExecutor springSessionRedisTaskExecutor(){ T

  • 使用udp发送>=128K的消息会报ENOBUFS的错误的解决方法

    这是一个困扰我两天的问题, Google和Baidu没有找到解决方法! 此文为记录这个问题,并给出原因和解决方法. 1.Unix domain socket简介 unix域协议并不是一个实际的协议族,而是在单个主机上执行客户/服务器通信的一种方法,所用API于在不同主机上执行客户/服务器通信所有的API(套接字API,如AF_INET.AF_INET6等类型的API)相同.unix域协议可以视为是进程之间本地通信IPC的一种. unix域提供两类套接口:字节流套接口(类似TCP)和数据报套接口(

随机推荐