日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

如何在Spring Boot中使用MQTT

瀏覽:44日期:2023-07-16 18:07:38
為什么選擇MQTT

MQTT的定義相信很多人都能講的頭頭是道,本文章也不討論什么高大上的東西,旨在用最簡(jiǎn)單直觀的方式讓每一位剛接觸的同行們可以最快的應(yīng)用起來

先從使用MQTT需要什么開始分析:

消息服務(wù)器 不同應(yīng)用/設(shè)備之間的頻繁交互 可能涉及一對(duì)多的消息傳遞

根據(jù)上面列舉的這三點(diǎn),我們大概可以了解到, MQTT最適合的場(chǎng)景是消息做為系統(tǒng)的重要組成部分,且參與著系統(tǒng)關(guān)鍵業(yè)務(wù)邏輯的情形

MQTT, 啟動(dòng)!

既然決定使用它,我們首先要研究的是如何讓MQTT正常工作,畢竟它不是簡(jiǎn)單的在maven里加入個(gè)依賴就完事的

我們總共需要干如下兩件事:

下載EMQX消息服務(wù)器, 作為broker 在maven中引入依賴

<dependency> <groupId>org.springframework.integration</groupId> <artifactId>spring-integration-mqtt</artifactId> <version>5.3.2.RELEASE</version> </dependency>

完成上面兩步后, 啟動(dòng)EMQX服務(wù)器, 正式進(jìn)入我們的MQTT旅途

使用方式

在Spring Boot中使用MQTT的代碼, 筆者總結(jié)了如下兩種方式:

使用spring-integration的消息通道概念 使用傳統(tǒng)的Client客戶端概念

第一種會(huì)產(chǎn)生一定程度的心智負(fù)擔(dān),但在筆者成功搭配(抄襲+造輪子)自動(dòng)注冊(cè)后, 比后者要方便許多

在介紹具體代碼之前, 我們先簡(jiǎn)單整理下使用中最常見的概念:

主題: MQTT消息的主要傳播途徑, 我們向主題發(fā)布消息, 訂閱主題, 從主題中讀取消息并進(jìn)行業(yè)務(wù)邏輯處理, 主題是消息的通道 生產(chǎn)者: MQTT消息的發(fā)送者, 他們向主題發(fā)送消息 消費(fèi)者: MQTT消息的接收者, 他們訂閱自己需要的主題, 并從中獲取消息 broker: 消息轉(zhuǎn)發(fā)器, 消息是通過它來承載的, EMQX就是我們的broker, 在使用中我們不用關(guān)心它的具體實(shí)現(xiàn)

其實(shí), MQTT的使用流程就是: 生產(chǎn)者給主題發(fā)消息->broker進(jìn)行消息的傳遞->訂閱該主題的消費(fèi)者拿到消息并進(jìn)行相應(yīng)的業(yè)務(wù)邏輯

Client模式

本模式和傳統(tǒng)的數(shù)據(jù)庫鏈接,Redis鏈接基本一致,有開發(fā)經(jīng)驗(yàn)的小伙伴們可以很輕松的駕馭,我們需要考慮的就是如果創(chuàng)建對(duì)應(yīng)的工廠,是單例模式,還是原型,亦或是造個(gè)池子呢?

我們使用單例模式來進(jìn)行本次的介紹

創(chuàng)建工廠類

首先, 我們創(chuàng)造一個(gè)工廠(就不承認(rèn)設(shè)計(jì)模式中毒)

public class MqttFactory { private static MqttProperties configuration; private static MqttClient client; /** * 獲取客戶端實(shí)例 * 單例模式, 存在則返回, 不存在則初始化 */ public static MqttClient getInstance() { if (client == null) { init(); } return client; } /** * 初始化客戶端 */ public static void init() { try { client = new MqttClient(configuration.getAddress(), 'client-' + System.currentTimeMillis()); // MQTT配置對(duì)象 MqttConnectOptions options = new MqttConnectOptions(); // 設(shè)置自動(dòng)重連, 其它具體參數(shù)可以查看MqttConnectOptions options.setAutomaticReconnect(true); if (!client.isConnected()) { client.connect(options); } } catch (MqttException e) { LOGGER.error(String.format('MQTT: 連接消息服務(wù)器[%s]失敗', configuration.getAddress())); } } }

關(guān)于MQTT的具體配置可以查看MqttConnectOptions, 在這里就不做說明了

多嘴一句, 文檔永遠(yuǎn)比某些博客給力!!!

創(chuàng)建工具類

接下來, 我們創(chuàng)建MqttUtil, 用于消息的發(fā)送以及主題的訂閱

public class MqttUtil { /** * 發(fā)送消息 * @param topic 主題 * @param data 消息內(nèi)容 */ public static void send(String topic, Object data) { // 獲取客戶端實(shí)例MqttClient client = MqttFactory.getInstance(); ObjectMapper mapper = new ObjectMapper(); try { // 轉(zhuǎn)換消息為json字符串 String json = mapper.writeValueAsString(data); client.publish(topic, new MqttMessage(json.getBytes(StandardCharsets.UTF_8))); } catch (JsonProcessingException e) { LOGGER.error(String.format('MQTT: 主題[%s]發(fā)送消息轉(zhuǎn)換json失敗', topic)); } catch (MqttException e) { LOGGER.error(String.format('MQTT: 主題[%s]發(fā)送消息失敗', topic)); } }/** * 訂閱主題 * @param topic 主題 * @param listener 消息監(jiān)聽處理器 */ public static void subscribe(String topic, IMqttMessageListener listener) { MqttClient client = MqttFactory.getInstance(); try {client.subscribe(topic, listener); } catch (MqttException e) {LOGGER.error(String.format('MQTT: 訂閱主題[%s]失敗', topic)); } } }

相信小伙伴們注意到了IMqttMessageListener這個(gè)東西, 我們只需要?jiǎng)?chuàng)建一個(gè)監(jiān)聽類, 實(shí)現(xiàn)IMqttMessageListener接口, 就可以處理消息啦, 代碼如下:

public class MessageListener implements IMqttMessageListener { /** * 處理消息 * @param topic 主題 * @param mqttMessage 消息 */ @Override public void messageArrived(String topic, MqttMessage mqttMessage) throws Exception { LOGGER.info(String.format('MQTT: 訂閱主題[%s]發(fā)來消息[%s]', topic, new String(mqttMessage.getPayload()))); }public static void main(String[] args) { //訂閱主題test01, 使用MessageListener來處理它的消息MqttUtil.subscribe('test01', new MessageListener()); }}

無論是發(fā)送還是訂閱,是不是都很好理解?

舒服的事情結(jié)束后, 帶來的是無盡的折磨和空虛, 來吧, 讓我們挑戰(zhàn)下心智負(fù)擔(dān)大的第二種模式!

Spring Integration

什么是Spring Integration?對(duì)不起,我不知道,我也不想知道

為什么使用Spring Integration?因?yàn)樗娴暮芎镁S護(hù)

網(wǎng)上大部分教程都是針對(duì)Spring Integration的, 可能是我第一次接觸, 千篇一律看的我莫名其妙, 所以我選擇放棄了他們, 選擇了大神的自動(dòng)配置方式,并在其基礎(chǔ)上,針對(duì)心智負(fù)擔(dān)進(jìn)行了相應(yīng)的調(diào)整

還記得我們之前討論過的概念嗎?主題/生產(chǎn)者/消費(fèi)者

在Spring Integration中,我們新加入一些概念, 并把之前的進(jìn)行微調(diào):

通道: 消息傳輸和接受的管道, 每一條消息都是通過它鉆進(jìn)鉆出 客戶端工廠: 用于創(chuàng)建MQTT客戶端, 和模式一中的類似 消息適配器: 用于接收MQTT消息, 進(jìn)行轉(zhuǎn)換, 但不參與業(yè)務(wù)邏輯 入站通道: 搭配消息適配器, 消息進(jìn)入站臺(tái)的通道 出站通道: 搭配客戶端工廠, 消息發(fā)出站臺(tái)的通道 主題: 還是主題, 它不變 生產(chǎn)者: 擁有出站通道的家伙 消費(fèi)者: 擁有入站通道的家伙

如果能漸漸理解上面定義的話, 這種模式的流程其實(shí)可以變成這樣:

生產(chǎn)者: 創(chuàng)建指定客戶端工廠的出站通道->發(fā)送消息 消費(fèi)者: 創(chuàng)建指定消息適配器的入站通道->接收消息->進(jìn)入消息攔截器->業(yè)務(wù)邏輯

其實(shí)在筆者看來, 這符合Spring Boot的理念, 約定優(yōu)于配置

代碼已挪入公司私服, 待后續(xù)個(gè)人私服配置好后再補(bǔ)充筆記

總結(jié)

MQTT作為消息服務(wù), 能夠滿足我們大部分的開發(fā)需求, 但還有一些遺留問題筆者還沒進(jìn)行過深入思考和實(shí)踐:

如何利用qos機(jī)制保證數(shù)據(jù)不會(huì)丟失 消息的隊(duì)列和排序 集群模式下的應(yīng)用

以上就是如何在Spring Boot中使用MQTT的詳細(xì)內(nèi)容,更多關(guān)于在Spring Boot中使用MQTT的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美亚洲国产一区| 欧洲一区二区三区精品| 欧美精品日日操| 在线看片福利| 欧美一区久久久| 国产精品字幕| 9久re热视频在线精品| 久久99伊人| 日韩精品1区2区3区| 欧美精品国产白浆久久久久| 丝瓜av网站精品一区二区| 久久中文字幕av一区二区不卡| 日韩精品午夜| 日韩精品一卡二卡三卡四卡无卡| 日本欧洲一区二区| 国产欧美在线| 久久精品免费一区二区三区| 九一国产精品| 日韩av网站在线免费观看| av在线资源| 欧美精品97| 久久青草久久| 涩涩涩久久久成人精品| 国产激情综合| 午夜日韩在线| 国产在线不卡| 蜜桃视频一区二区三区在线观看| 国产日韩中文在线中文字幕| 国产极品久久久久久久久波多结野| 精品日韩一区| 蜜桃视频一区二区三区在线观看| 欧美日韩在线精品一区二区三区激情综合 | 亚洲精品一区二区妖精| 婷婷亚洲综合| 日韩有码av| 久久久人人人| 国产精品日本欧美一区二区三区| 91成人精品观看| 97精品在线| 亚洲视频电影在线| 国产福利91精品一区二区| 狠狠爱成人网| caoporn视频在线| 日韩欧美久久| 国产伊人精品| 精品三级国产| 日韩国产一区二| 国产精品99免费看| 国产剧情一区二区在线观看| 99视频精品全国免费| 欧美久久亚洲| 蜜臀av性久久久久蜜臀aⅴ流畅 | 国产精品国产一区| 蜜桃视频第一区免费观看| 日本精品不卡| 麻豆国产欧美一区二区三区| 99国内精品| 女人av一区| 亚洲一级特黄| 欧美日韩xxxx| 免费一级片91| 亚洲午夜黄色| 亚洲小说欧美另类婷婷| 日韩欧美三级| 成人国产精品一区二区免费麻豆| 日本91福利区| 欧美一区精品| 国产精品一区二区三区av| 欧美日韩一区二区高清| 欧美另类中文字幕| 国产亚洲精品美女久久 | 久久久久久网| 在线看片国产福利你懂的| 日韩免费视频| 欧美日韩国产一区精品一区| 日韩一区二区三区免费播放| 理论片午夜视频在线观看| 日韩在线精品| 午夜欧美视频| 少妇高潮一区二区三区99| 视频小说一区二区| 91成人小视频| 国产精品久久久久77777丨| 精品一区二区男人吃奶| 高清av不卡| 免费视频亚洲| 97久久超碰| 中文字幕在线免费观看视频| 久久精品国产亚洲夜色av网站| 午夜久久99| 蜜臀av在线播放一区二区三区 | 亚洲日韩中文字幕一区| 国产欧美日韩精品一区二区免费| 国产精品白浆| 国产一区亚洲| 国产精品色在线网站| 日韩精品dvd| 日韩精品亚洲专区在线观看| 色乱码一区二区三区网站| 99国产精品久久久久久久成人热| 日本少妇一区二区| 蜜桃视频欧美| 麻豆久久久久久| 久久亚洲人体| 天堂成人免费av电影一区| 国产精品麻豆成人av电影艾秋 | 日韩精品1区2区3区| 久久电影tv| 青青伊人久久| 亚洲一区中文| 日韩精品永久网址| 国产乱人伦精品一区| 99成人在线| 欧美香蕉视频| 日韩国产在线观看一区| 激情婷婷综合| 久久久久久婷| 国产精品密蕾丝视频下载| 丝袜诱惑制服诱惑色一区在线观看| 国产精品s色| 日本不卡一二三区黄网| 亚洲一区不卡| 免费成人网www| 日韩在线中文| 成人午夜亚洲| 欧美激情三区| 亚洲精品麻豆| 在线观看亚洲精品福利片| 亚洲精品一区二区在线看| 久久久国产精品网站| 国产美女久久| 欧美精品三级在线| 国产精品亚洲人成在99www| 日本不卡一二三区黄网| 欧美一区精品| 精品久久99| 欧产日产国产精品视频| 久久伦理在线| 深夜日韩欧美| 国产成人精选| 久久亚洲国产| 中文字幕一区二区三区日韩精品| 日韩高清中文字幕一区| 美女免费视频一区| 美女av一区| а√在线中文在线新版| 999久久久91| 中国字幕a在线看韩国电影| 精品免费av一区二区三区| 欧美激情视频一区二区三区免费| 国产精品欧美大片| 99久久精品费精品国产| 欧美精品一二| 午夜久久免费观看| 亚洲精品888| 亚洲三级精品| 国产欧美高清| 国产一区2区| 欧洲一级精品| 91精品国产91久久久久久黑人| 久久久久网站| 欧美日一区二区| 老牛国产精品一区的观看方式| 亚洲精品第一| 国产亚洲欧美日韩精品一区二区三区 | 欧美成a人国产精品高清乱码在线观看片在线观看久 | 日韩动漫一区| 国产精品一区亚洲| 日韩久久视频| 日韩影院在线观看| 国产精品免费99久久久| 日韩中文首页| 99精品美女| 中文字幕成人| 国语精品一区| 欧美女激情福利| 国产精品啊v在线| 亚洲精品123区| 国产精品一区二区av日韩在线| 欧美精品高清| 日韩国产在线观看| 国产精品美女久久久久久不卡| 日韩亚洲一区在线| 91精品尤物| 日韩毛片视频| 久久国产精品99国产| 99久久精品国产亚洲精品| 亚州欧美在线| 久久精品亚洲人成影院 | 日本成人在线网站| 91精品婷婷色在线观看| 日韩精品三区四区| 久久久人人人| 精品久久影院| 少妇精品在线| 99视频精品免费观看| 日韩不卡免费高清视频| 久久97久久97精品免视看秋霞| 九一国产精品| 日韩免费久久|