解決spring-integration-mqtt頻繁報(bào)Lost connection錯(cuò)誤問題
問題描述
在之前的博客介紹了如何在 Spring Boot 集成 MQTT,后面使用中沒有發(fā)現(xiàn)問題,最近發(fā)現(xiàn)一直報(bào)錯(cuò):
Lost connection: Connection lost; retrying...
Lost connection: 已斷開連接; retrying...
解決過程
網(wǎng)上說是因?yàn)?client ID 重復(fù),最開始是不相信的,因?yàn)槲覝y(cè)試只啟動(dòng)了一個(gè)客戶端。但是卻怎么都定位不到異常原因,用重新回到 client ID 重復(fù)的這個(gè)思路上來:
因?yàn)槌绦蚶锿瑫r(shí)作為訂閱者和發(fā)布者,就懷疑訂閱和發(fā)布服務(wù)是不是單獨(dú)建立的連接,抱著試試看的想法試了一下,結(jié)果果然是這個(gè)原因
原代碼:
/* 發(fā)布者 */ @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; }
訂閱者和發(fā)布者使用的是相同的 client ID,修改后代碼:
/* 發(fā)布者 */ @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; }
總結(jié)
雖然目前解決了這個(gè)問題,但是為什么會(huì)單獨(dú)建立兩個(gè)連接的原因還未找到;另外,一個(gè)程序兩個(gè)連接還是感覺怪怪的,不知道還有沒有更優(yōu)的處理方案。
希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- 在Node.js下運(yùn)用MQTT協(xié)議實(shí)現(xiàn)即時(shí)通訊及離線推送的方法
- Django連接MQTT的示例代碼
- vue3+vite2+mqtt連接遇到的坑及解決
- vue3使用mqtt的示例代碼
- MQTT.js 入門使用教程
- 詳解JS HTML Web端使用MQTT通訊測(cè)試
- VUE3+mqtt封裝解決多頁(yè)面使用需重復(fù)連接等問題(附實(shí)例)
- JS?連接MQTT的使用方法
- 使用java?實(shí)現(xiàn)mqtt兩種常用方式
- Android MQTT與WebSocket協(xié)議詳細(xì)講解
- MQTT Client實(shí)現(xiàn)消息推送功能的方法詳解
相關(guān)文章
java如何用反射將一個(gè)對(duì)象復(fù)制給另一個(gè)對(duì)象
這篇文章主要介紹了java如何用反射將一個(gè)對(duì)象復(fù)制給另一個(gè)對(duì)象問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09SpringBoot集成QQ第三方登陸的實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot集成QQ第三方登陸的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11Springboot 使用內(nèi)置tomcat禁止不安全HTTP的方法
這篇文章主要介紹了Springboot 使用內(nèi)置tomcat禁止不安全HTTP的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07Java模擬HTTP Get Post請(qǐng)求 輕松實(shí)現(xiàn)校園BBS自動(dòng)回帖
這篇文章主要介紹了Java模擬HTTP Get Post請(qǐng)求,輕松實(shí)現(xiàn)校園BBS自動(dòng)回帖,感興趣的小伙伴們可以參考一下2015-12-12JavaWeb實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)(3)
這篇文章主要為大家詳細(xì)介紹了JavaWeb實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)第三篇,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08java版數(shù)獨(dú)游戲界面實(shí)現(xiàn)(二)
這篇文章主要為大家詳細(xì)介紹了java版數(shù)獨(dú)游戲界面實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12Eclipse轉(zhuǎn)Itellij IDEA導(dǎo)入Git/svn本地項(xiàng)目的詳細(xì)步驟
這篇文章主要介紹了Eclipse轉(zhuǎn)Itellij IDEA導(dǎo)入Git/svn本地項(xiàng)目,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10springboot json時(shí)間格式化處理的方法
這篇文章主要介紹了springboot json時(shí)間格式化處理的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-03-03