<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
前幾天粉絲群裡有個小夥伴問過:web
頁面的未讀訊息(小紅點)怎麼實現比較簡單,剛好本週手頭有類似的開發任務,索性就整理出來供小夥伴們參考,沒準哪天就能用得上呢。
之前在 《springboot + rabbitmq 做智慧家居》 中說過可以用 rabbitmq
的 MQTT
協定做智慧家居的指令推播,裡邊還提到過能用 MQTT
協定做 web
的訊息推播,而未讀訊息(小紅點
)功能剛好應用到實時訊息推播了。
MQTT
協定就不再贅述了,沒接觸過的同學翻翻前邊的文章溫習一下吧,今天還是主要以實踐為主!
web
端實時訊息推播,常用的實現方式比較多,但萬變不離其宗,底層基本上還是依賴於 websocket
,MQTT
協定也不例外。
RabbitMQ
的基礎搭建就不詳細說了,自行百度一步一步搞問題不大,這裡主要說一下兩個比較重要的設定。
預設情況下RabbitMQ
是不開啟MQTT
協定的,所以需要我們手動的開啟相關的外掛,而RabbitMQ
的MQTT
協定分為兩種。
第一種 rabbitmq_mqtt
提供與後端服務互動使用,對應埠1883
。
rabbitmq-plugins enable rabbitmq_mqtt
第二種 rabbitmq_web_mqtt
提供與前端互動使用,對應埠15675
。
rabbitmq-plugins enable rabbitmq_web_mqtt
在 RabbitMQ
管理後臺看到如下的顯示,就表示MQTT
協定開啟成功,到這中介軟體環境就搭建完畢了。
協定對應埠號
使用MQTT
協定預設的交換機 Exchange
為 amp.topic
,而我們訂閱的主題會在 Queues
註冊一個使用者端佇列,路由 Routing key
就是我們設定的主題。
交換機資訊
web
端實時訊息推播一般都是單向的推播,前端接收伺服器端推播的訊息顯示即可,所以就只實現訊息傳送即可。
引入 spring-integration-mqtt
、org.eclipse.paho.client.mqttv3
兩個工具包實現
<!--mqtt依賴包--> <dependency> <groupId>org.springframework.integration</groupId> <artifactId>spring-integration-mqtt</artifactId> </dependency> <dependency> <groupId>org.eclipse.paho</groupId> <artifactId>org.eclipse.paho.client.mqttv3</artifactId> <version>1.2.0</version> </dependency>
訊息的傳送比較簡單,主要是應用到 @ServiceActivator
註解,需要注意messageHandler.setAsync
屬性,如果設定成 false
,關閉非同步模式傳送訊息時可能會阻塞。
@Configuration public class IotMqttProducerConfig { @Autowired private MqttConfig mqttConfig; @Bean public MqttPahoClientFactory mqttClientFactory() { DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory(); factory.setServerURIs(mqttConfig.getServers()); return factory; } @Bean public MessageChannel mqttOutboundChannel() { return new DirectChannel(); } @Bean @ServiceActivator(inputChannel = "iotMqttInputChannel") public MessageHandler mqttOutbound() { MqttPahoMessageHandler messageHandler = new MqttPahoMessageHandler(mqttConfig.getServerClientId(), mqttClientFactory()); messageHandler.setAsync(false); messageHandler.setDefaultTopic(mqttConfig.getDefaultTopic()); return messageHandler; } }
MQTT
對外提供傳送訊息的 API
時,需要使用 @MessagingGateway
註解,去提供一個訊息閘道器代理,引數 defaultRequestChannel
指定傳送訊息繫結的channel
。
可以實現三種API
介面,payload
為傳送的訊息,topic
傳送訊息的主題,qos
訊息質量。
@MessagingGateway(defaultRequestChannel = "iotMqttInputChannel") public interface IotMqttGateway { // 向預設的 topic 傳送訊息 void sendMessage2Mqtt(String payload); // 向指定的 topic 傳送訊息 void sendMessage2Mqtt(String payload,@Header(MqttHeaders.TOPIC) String topic); // 向指定的 topic 傳送訊息,並指定服務質量引數 void sendMessage2Mqtt(@Header(MqttHeaders.TOPIC) String topic, @Header(MqttHeaders.QOS) int qos, String payload); }
前端使用與伺服器端對應的工具 paho-mqtt
mqttws31.js
實現,實現方式與傳統的 websocket
方式差不多,核心方法 client = new Paho.MQTT.Client
和 各種監聽事件,程式碼比較簡潔。
注意:要保證前後端 clientId
的全域性唯一性,我這裡就簡單用亂數解決了
<script type="text/javascript"> // mqtt協定rabbitmq服務 var brokerIp = location.hostname; // mqtt協定埠號 var port = 15675; // 接受推播訊息的主題 var topic = "push_message_topic"; // mqtt連線 client = new Paho.MQTT.Client(brokerIp, port, "/ws", "clientId_" + parseInt(Math.random() * 100, 10)); var options = { timeout: 3, //超時時間 keepAliveInterval: 30,//心跳時間 onSuccess: function () { console.log(("連線成功~")); client.subscribe(topic, {qos: 1}); }, onFailure: function (message) { console.log(("連線失敗~" + message.errorMessage)); } }; // 考慮到https的情況 if (location.protocol == "https:") { options.useSSL = true; } client.connect(options); console.log(("已經連線到" + brokerIp + ":" + port)); // 連線斷開事件 client.onConnectionLost = function (responseObject) { console.log("失去連線 - " + responseObject.errorMessage); }; // 接收訊息事件 client.onMessageArrived = function (message) { console.log("接受主題: " + message.destinationName + "的訊息: " + message.payloadString); $("#arrivedDiv").append("<br/>"+message.payloadString); var count = $("#count").text(); count = Number(count) + 1; $("#count").text(count); }; // 推播給指定主題 function sendMessage() { var a = $("#message").val(); if (client.isConnected()) { var message = new Paho.MQTT.Message(a); message.destinationName = topic; client.send(message); } } </script>
前後端的程式碼並不多,接下來我們測試一下,弄了個頁面看看效果。
首先用 postman
模擬後端傳送訊息
http://127.0.0.1:8080/fun/sendMessage?message=我是程式設計師內點事&topic=push_message_topic
模擬傳送訊息
再看一下前端訂閱訊息的效果,看到訊息被實時推播到了前端,這裡只做了未讀訊息數量統計,一般還會做未讀訊息詳情列表。
實時訊息推播動圖
未讀訊息是一個十分常見的功能,不管是 web
端還是行動端系統都是必備的模組,MQTT
協定只是其中的一種實現方式,還是有必要掌握一種方法。具體用什麼工具實現還是要看具體的業務場景和學習成本,像我用RabbitMQ
做還考慮到一些運維成本在裡邊。
本文完整程式碼地址:https://github.com/chengxy-nds/Springboot-Notebook/tree/master/springboot-mqtt-messagepush
以上就是前端與RabbitMQ實時訊息推播未讀訊息小紅點實現範例的詳細內容,更多關於前端 RabbitMQ實時訊息推播的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45