解決spring-integration-mqtt頻繁報(bào)Lost connection錯(cuò)誤問(wèn)題
問(wèn)題描述
在之前的博客介紹了如何在 Spring Boot 集成 MQTT,后面使用中沒(méi)有發(fā)現(xiàn)問(wèn)題,最近發(fā)現(xiàn)一直報(bào)錯(cuò):
Lost connection: Connection lost; retrying...
Lost connection: 已斷開(kāi)連接; retrying...
解決過(guò)程
網(wǎng)上說(shuō)是因?yàn)?client ID 重復(fù),最開(kāi)始是不相信的,因?yàn)槲覝y(cè)試只啟動(dòng)了一個(gè)客戶端。但是卻怎么都定位不到異常原因,用重新回到 client ID 重復(fù)的這個(gè)思路上來(lái):
因?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è)問(wèn)題,但是為什么會(huì)單獨(dú)建立兩個(gè)連接的原因還未找到;另外,一個(gè)程序兩個(gè)連接還是感覺(jué)怪怪的,不知道還有沒(méi)有更優(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ù)連接等問(wèn)題(附實(shí)例)
- JS?連接MQTT的使用方法
- 使用java?實(shí)現(xiàn)mqtt兩種常用方式
- Android MQTT與WebSocket協(xié)議詳細(xì)講解
- MQTT Client實(shí)現(xiàn)消息推送功能的方法詳解
相關(guān)文章
通過(guò)spring注解開(kāi)發(fā),簡(jiǎn)單測(cè)試單例和多例區(qū)別
這篇文章主要介紹了通過(guò)spring注解開(kāi)發(fā),簡(jiǎn)單測(cè)試單例和多例區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
Spring Cloud 整合Apache-SkyWalking實(shí)現(xiàn)鏈路跟蹤的方法
這篇文章主要介紹了Spring Cloud 整合Apache-SkyWalking鏈路跟蹤的示例代碼,代碼簡(jiǎn)單易懂,通過(guò)圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06
Spring?Security?OAuth?Client配置加載源碼解析
這篇文章主要為大家介紹了Spring?Security?OAuth?Client配置加載源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
Java實(shí)現(xiàn)文件切割拼接的實(shí)現(xiàn)代碼
這篇文章主要介紹了Java實(shí)現(xiàn)文件切割拼接的實(shí)現(xiàn)代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-11-11
解釋為什么Java中“1000==1000”為false而”100==100“為true
在日常編程中,我們經(jīng)常遇到一些看似簡(jiǎn)單卻隱藏著復(fù)雜邏輯的問(wèn)題,這篇文章主要介紹了解釋為什么Java中“1000==1000”為false而”100==100“為true,需要的朋友可以參考下2024-01-01
idea導(dǎo)入項(xiàng)目不顯示maven側(cè)邊欄的問(wèn)題及解決方法
這篇文章主要介紹了idea導(dǎo)入項(xiàng)目不顯示maven側(cè)邊欄的問(wèn)題及解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07

