Java優雅使用Spring Boot+MQTT推送與訂閱

在物聯網(IoT)和智能設備橫行的今天,你有沒有遇到這樣的問題:

  • 服務端需要實時把報警、狀態更新、控制指令推送給客戶端;

  • 安卓 App、嵌入式設備、網頁等終端,需要輕量且穩定的連接方式;

  • HTTP 太“重”、WebSocket 配置又麻煩?

這時,輕量級消息傳輸協議 MQTT(Message Queuing Telemetry Transport)登場!

一句話理解 MQTT:專為低帶寬、高并發、實時通信設計的發布-訂閱協議。

那么問題來了 —— 在 Spring Boot 項目中,如何快速、優雅、高可控地落地 MQTT?

-01-

MQTT 接入方案選擇?

MQTT 本身只是一種通信協議,并不指定你用哪個消息中間件。而目前支持 MQTT 的主流 Broker 包括:

Broker

特點簡述

Mosquitto

輕量級,C語言實現,非常穩定

RabbitMQ

插件支持 MQTT,易與現有系統整合

EMQX

高性能 MQTT Broker,專為 IoT 優化

HiveMQ

商用支持強,價格偏貴

本次我們采用的是:RabbitMQ + MQTT 插件,實現服務端到安卓客戶端的推送通知,配合 Spring Boot 框架,集成簡便,生產可用!

-02-

MQTT 三大角色?

MQTT,就像微信一樣:

  • Publisher(發布者):你發朋友圈

  • Broker(中間人):微信服務器

  • Subscriber(訂閱者):看到你朋友圈的朋友

也就是說,消息不是點對點的,而是“你說一句,誰訂閱了就能聽到”。


-03-

實戰解析

Spring Boot + RabbitMQ MQTT 實現推送系統

整體架構:

[Spring Boot服務]?--發布消息-->?[RabbitMQ MQTT插件]?-->?[MQTT客戶端訂閱接收消息]

RabbitMQ 開啟 MQTT 插件

rabbitmq-plugins?enable?rabbitmq_mqtt ? ? ? ?# 服務端 MQTT 協議,端口1883rabbitmq-plugins?enable?rabbitmq_web_mqtt ? ?# Web前端用 MQTT 協議,端口15675

引入依賴

<dependency>??<groupId>org.springframework.integration</groupId>??<artifactId>spring-integration-mqtt</artifactId></dependency>

配置 application.yml

mqtt-push:? clientId: mqtt_client_? serverClientId: mqtt_server_? servers: tcp://127.0.0.1:1883? username: guest? password: guest? defaultTopic: sensor/+/temperature

配置連接工廠

@Beanpublic?MqttPahoClientFactory?mqttClientFactory()?{? ??DefaultMqttPahoClientFactory?factory?=?new?DefaultMqttPahoClientFactory();? ??MqttConnectOptions?options?=?new?MqttConnectOptions();? ? options.setServerURIs(servers.split(","));? ? options.setCleanSession(false);? ? options.setUserName(username);? ? options.setPassword(password.toCharArray());? ? options.setKeepAliveInterval(20);? ? factory.setConnectionOptions(options);? ??return?factory;}

服務端推送消息

@Bean@ServiceActivator(inputChannel =?"mqttOutboundChannel")public?MessageHandler?mqttOutbound() {? ??MqttPahoMessageHandler?handler =?new?MqttPahoMessageHandler(serverClientId +?"producer_"?+?RandomUtil.getRandomStr(),?mqttClientFactory());? ? handler.setAsync(true);? ? handler.setDefaultQos(1);? ? handler.setDefaultTopic(defaultTopic);? ??return?handler;}

使用接口發送消息:

@MessagingGateway(defaultRequestChannel =?"mqttOutboundChannel")public?interface?MqttGateway?{? ? void sendMessage2Mqtt(String?data,?@Header(MqttHeaders.TOPIC)?String topic);}

服務端監聽客戶端消息

@Beanpublic?MessageProducer?inbound() {? ??MqttPahoMessageDrivenChannelAdapter?adapter =?new?MqttPahoMessageDrivenChannelAdapter(? ? ? ? clientId +?"consumer_"?+?RandomUtil.getRandomStr(),?mqttClientFactory(), defaultTopic);? ? adapter.setQos(2);? ? adapter.setOutputChannel(mqttInputChannel());? ??return?adapter;}

處理消息回調:

@Bean@ServiceActivator(inputChannel =?"mqttInputChannel")public?MessageHandler?mqttInMessageHandler() {? ??return?message -> {? ? ? ??String?topic = message.getHeaders().get(MqttHeaders.RECEIVED_TOPIC).toString();? ? ? ??String?payload = message.getPayload().toString();? ? ? ? log.info("收到消息:主題 [{}] 內容 [{}]", topic, payload);? ? };}

MQTTBox 測試

MQTTBox 是一款強大的 MQTT 測試工具,可以模擬發送消息,也能訂閱查看接收到的消息:

1. 發布測試

使用 MQTTBox 向?sensor/s123/temperature?發布消息
服務端通過通配符?sensor/+/temperature?成功收到消息!

2. 控制器測試

@PostMapping("/sendMessage")public?String?sendMqtt(@RequestBody?ReqSendMsgDTO dto) {? ? mqttGateway.sendMessage2Mqtt(dto.getTopic(), dto.getPayload());? ??return?"SUCCESS";}

-04-

總結

實踐建議

  • clientId?必須唯一,推薦使用 UUID 或服務實例標識;

  • QoS 建議使用 1(至少一次),避免消息丟失;

  • 若用 RabbitMQ,也可以使用 Exchange + Topic Binding 方式做高級路由;

  • 對于高并發或長連接推送,推薦結合 Netty 或 Gateway 層限流處理。

技術方案

能力點

技術實現

協議支持

MQTT(通過 rabbitmq_mqtt 插件)

服務端推送

Spring Integration + MqttGateway

客戶端訂閱

MqttPahoMessageDrivenChannelAdapter

工具聯調

MQTTBox / Postman / 模擬器

安全與穩定性

唯一 clientId、QoS 保證、自動重連

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/90977.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/90977.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/90977.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

多目標粒子群優化(MOPSO)解決ZDT1問題

前言 提醒&#xff1a; 文章內容為方便作者自己后日復習與查閱而進行的書寫與發布&#xff0c;其中引用內容都會使用鏈接表明出處&#xff08;如有侵權問題&#xff0c;請及時聯系&#xff09;。 其中內容多為一次書寫&#xff0c;缺少檢查與訂正&#xff0c;如有問題或其他拓展…

Coze Studio概覽(三)--智能體管理

本文簡要分析了Coze Studio中智能體管理功能&#xff0c;包括功能、架構以及核心流程。Coze Studio 智能體管理功能分析 1. 智能體管理架構概覽 Coze Studio的智能體管理系統基于DDD架構&#xff0c;主要包含以下核心模塊&#xff1a; 后端架構層次&#xff1a; API層 (coze): …

idea運行tomcat日志亂碼問題

原因在于idea和tomcat文件編碼格式不一樣。可以把idea編碼改成UTF-8 File | Settings | Editor | File Encodings 里面把GBK都改成UTF-8help里面 Edit Custom VM Options 添加一行-Dfile.encodingUTF-8重啟idea

Javaweb - 13 - AJAX

發送請求的幾種方式1. 瀏覽器的地址框中輸入地址&#xff0c;回車2. html --> head --> scrip / linkimg 自動發送請求&#xff0c;無需手動觸發3. a 標簽&#xff0c;form 表單標簽需要手動控制提交產生&#xff0c;且往往需要在新的頁面上獲得響應信息4. 運行 JS 代碼…

qt常用控件-06

文章目錄qt常用控件-06spinBox/doubleSpinBoxdateTimeEditdialSliderlistWIdgettableWidgettreeWidget結語很高興和大家見面&#xff0c;給生活加點impetus&#xff01;&#xff01;開啟今天的編程之路&#xff01;&#xff01; 今天我們進一步c11中常見的新增表達 作者&#…

小智源碼分析——音頻部分(二)

一、利用創建好的對象來調用音頻服務 上周從上圖的getaudiocode()方法進去感受了一下底層小智的構造如何實現。所以用一個codec來接收我們所構造的音頻對象。下來是用構造好的音頻對象來調用音頻初始化服務Initialize&#xff0c;因為啟動函數Application函數的類中有audio_ser…

菜鳥的C#學習(四)

文章目錄一、格式說明符1.1、數字格式說明符&#xff08;適用于數值類型&#xff1a;int, double, decimal 等&#xff09;1. 標準數字格式2. 自定義數字格式1.2、日期時間格式說明符&#xff08;適用于 DateTime, DateTimeOffset&#xff09;1. 標準日期時間格式2. 自定義日期…

基于黑馬教程——微服務架構解析(二)

本篇文章基于黑馬程序員的微服務課程內容&#xff0c;結合個人學習過程中的理解與思考進行整理。本節將圍繞以下幾個問題展開&#xff1a;什么是網關和配置管理前面那篇文章&#xff0c;我們了解如何把一個單體的項目拆成分布式微服務項目&#xff0c;并且講解一下各個服務之間…

Text2SQL智能問答系統開發(一)

開發一個面向企業的chatBI工作流 已完成 基礎 Text2SQL 功能實現 實現用戶輸入自然語言問題后&#xff0c;系統能夠自動生成 SQL 并執行返回結果。用戶交互優化 支持用戶通過補充信息對查詢進行調整&#xff0c;提升易用性。模糊時間處理機制 對“最近”“近期”等模糊時間關…

Python HTML模塊詳解:從基礎到實戰

一、模塊體系全景圖 Python生態中處理HTML的工具可分為三大層級&#xff1a; 標準庫基礎層&#xff1a;html模塊 html.parser第三方增強層&#xff1a;BeautifulSoup&#xff08;搭配解析器&#xff09;專業級工具層&#xff1a;lxml requests-html 二、標準庫核心模塊詳解…

PyTorch常用Tensor形狀變換函數詳解

PyTorch常用Tensor形狀變換函數詳解 在PyTorch中&#xff0c;對張量&#xff08;Tensor&#xff09;進行形狀變換是深度學習模型構建中不可或缺的一環。無論是為了匹配網絡層的輸入要求&#xff0c;還是為了進行數據預處理和維度調整&#xff0c;都需要靈活運用各種形狀變換函數…

自主智能Agent如何重塑工作流自動化:技術、經濟與未來展望

自主智能Agent的崛起與工作流自動化的范式革命2025年7月&#xff0c;當OpenAI向付費用戶推出具備網頁瀏覽和代碼執行能力的ChatGPT Agent時&#xff0c;工作流自動化領域迎來了一場靜默但徹底的革命。這款不再滿足于簡單問答的智能體&#xff0c;在一個安全的虛擬計算機環境中運…

技術架構、行業應用、工具鏈整合、挑戰應對及未來趨勢五大模塊,引用多個權威來源數據與開源項目實現細節。

以下是一份關于AI技術落地的實戰經驗總結報告&#xff0c;結合代碼示例、可視化圖表與行業案例&#xff0c;內容分為技術架構、行業應用、工具鏈整合、挑戰應對及未來趨勢五大模塊&#xff0c;引用多個權威來源數據與開源項目實現細節。AI技術落地實戰指南&#xff1a;從架構設…

第 9 篇:神經網絡初探——當AI擁有了“大腦”,世界從此不同

《人工智能AI之機器學習基石》系列⑨ 專欄核心理念: 用通俗語言講清楚機器學習的核心原理,強調“洞察 + 技術理解 + 應用連接”,構建一個完整的、富有啟發性的知識體系。

音頻焦點 Android Audio Focus 進階

舊焦點處理 示例調用鏈: requestAudioFocus() → propagateFocusLossFromGain_syncAf() → handleFocusLossFromGain()。 系統事件(如來電)→ 強制焦點變化 → handleFocusLossFromGain()。 函數 propagateFocusLossFromGain_syncAf 焦點持有者發生的焦點丟失通知 主要功能…

MFC UI對話框

文章目錄對話框模態對話框創建銷毀關閉CDialog::OnCancel()EndDialog()CDialog::DestroyWindow()非模態對話框創建銷毀關閉delete this對話框 模態對話框 ??阻塞父窗口??&#xff0c;強制用戶先處理對話框。關閉前父窗口無法響應事件。 創建 推薦&#xff1a;非指針方式…

RabbitMQ--@RabbitListener及@RabbitHandle

兩者區別 在 Spring AMQP 中&#xff0c;RabbitListener 和 RabbitHandler 是處理 RabbitMQ 消息的核心注解&#xff0c;但職責和使用場景完全不同。以下從 定義、區別、場景、示例 逐層解析&#xff1a;一、核心定義1. RabbitListener作用&#xff1a;標記 方法或類 為 Ra…

【基于CKF的IMM】MATLAB例程,CV和CT兩個模型下的IMM,二維,濾波使用CKF(容積卡爾曼濾波),附下載鏈接

本程序實現了基于交互多模型&#xff08;IMM&#xff09;容積卡爾曼濾波&#xff08;CKF&#xff09;的多模型融合定位方法&#xff0c;并與純CV?CKFCV-CKFCV?CKF&#xff08;勻速模型&#xff09;和CT?CKFCT-CKFCT?CKF&#xff08;勻角速度轉彎模型&#xff09;方法對比。…

AI資訊日報 - 2025年07月28日

AI資訊日報 | 2025年07月28日 周一 今日核心要點 精華提煉 技術突破 ? 騰訊混元&#xff1a;開源發布、3D技術 ? 書生Intern&#xff1a;開源發布、多模態 企業動態 ? AI工具集&#xff1a;協同創作、視頻生成 數據概覽分類數量重點關注技術突破2 條開源發布、3D技術企業動態…

大語言模型 LLM 通過 Excel 知識庫 增強日志分析,根因分析能力的技術方案(1):總體介紹

文章大綱 1. 核心目標 2. 系統總體架構 3. Google Cloud 端到端方案(含無 RAG & RAG 雙模式) 3.1 無 RAG:Function-Calling 查表模式 3.2 RAG:托管式向量檢索 4. 開源輕量級方案 5. 數字孿生聯合驗證(實驗性) 6. 知識圖譜增強(Neo4j) 7. 監控與持續優化(CometLLM)…