日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線(xiàn)咨詢(xún)客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

原文地址:https://dwz.cn/FFB05DFg

作者:碼農(nóng)小胖哥

場(chǎng)景:

今天項(xiàng)目經(jīng)理交給我一個(gè)開(kāi)發(fā)任務(wù)。如果有人在前臺(tái)下了訂單就給后臺(tái)倉(cāng)庫(kù)管理一個(gè)發(fā)貨通知。也就是服務(wù)端觸發(fā)一個(gè)事件,推送消息到客戶(hù)端。

如果我用websocket來(lái)做還要搞個(gè)websocket服務(wù)器,而且還 有不少配置。websocket是全雙工通信,單向通信簡(jiǎn)直是殺雞用牛刀。用輪詢(xún)吧,浪費(fèi)服務(wù)器資源不說(shuō),還不一定實(shí)時(shí),訂單處理慢了豈不是怠慢了客戶(hù)。有沒(méi)有別的選擇呢?當(dāng)然有!

Java服務(wù)端推送消息有那么難嗎?

 

1.SSE推送技術(shù)

SSE全稱(chēng)Server-sent Events,是html 5 規(guī)范的一個(gè)組成部分,具體去MDN網(wǎng)站查看相關(guān)文檔。該規(guī)范十分簡(jiǎn)單,主要由兩個(gè)部分組成:第一個(gè)部分是服務(wù)器端與瀏覽器端之間的通訊協(xié)議,第二部分是在瀏覽器端可供 JAVAScript 使用的 EventSource 對(duì)象。通訊協(xié)議是基于純文本的簡(jiǎn)單協(xié)議。服務(wù)器響應(yīng)的內(nèi)容類(lèi)型是“text/event-stream”。響應(yīng)文本的內(nèi)容可以看成是一個(gè)事件流,由不同的事件所組成。每個(gè)事件由類(lèi)型和數(shù)據(jù)兩部分組成,同時(shí)每個(gè)事件可以有一個(gè)可選的標(biāo)識(shí)符。不同事件的內(nèi)容之間通過(guò)僅包含回車(chē)符和換行符的空行(“rn”)來(lái)分隔。每個(gè)事件的數(shù)據(jù)可能由多行組成。

Java服務(wù)端推送消息有那么難嗎?

 

如上圖所示,每個(gè)事件之間通過(guò)空行來(lái)分隔。每一行都是由鍵值對(duì)組成。如果鍵為空則表示該行為注釋?zhuān)瑫?huì)在處理時(shí)被忽略。例如第10行。

第1行表示一個(gè)只包含數(shù)據(jù)的事件。會(huì)按照默認(rèn)事件走(message事件)。第3-4行代表一個(gè)附帶eventID的事件。第6-8行代表一個(gè)自定義事件。第10-14行代表一個(gè)多行數(shù)據(jù)事件,多行數(shù)據(jù)由換行符鏈接

key定義有以下幾種:

  • data,表示該行包含的是數(shù)據(jù)。以 data 開(kāi)頭的行可以出現(xiàn)多次。所有這些行都是該事件的數(shù)據(jù)。
  • event,表示該行用來(lái)聲明事件的類(lèi)型。瀏覽器在收到數(shù)據(jù)時(shí),會(huì)產(chǎn)生對(duì)應(yīng)類(lèi)型的事件。默認(rèn)提供三個(gè)標(biāo)準(zhǔn)事件(當(dāng)然你可以自定義):
Java服務(wù)端推送消息有那么難嗎?

 

  • id,表示該行用來(lái)聲明事件的標(biāo)識(shí)符。服務(wù)器端返回的數(shù)據(jù)中包含了事件的標(biāo)識(shí)符,瀏覽器會(huì)記錄最近一次接收到的事件的標(biāo)識(shí)符。如果與服務(wù)器端的連接中斷,當(dāng)瀏覽器端再次進(jìn)行連接時(shí),會(huì)通過(guò) HTTP 頭“Last-Event-ID”來(lái)聲明最后一次接收到的事件的標(biāo)識(shí)符。服務(wù)器端可以通過(guò)瀏覽器端發(fā)送的事件標(biāo)識(shí)符來(lái)確定從哪個(gè)事件開(kāi)始來(lái)繼續(xù)連接。
  • retry,表示該行用來(lái)聲明瀏覽器在連接斷開(kāi)之后進(jìn)行再次連接之前的等待時(shí)間。

SSE只適用于高級(jí)瀏覽器,但是注意IE不直接支持。IE上的XMLHttpRequest對(duì)象不支持獲取部分的響應(yīng)內(nèi)容,所以不支持。每次總有IE,怪不得快被淘汰了。

2.SSE VS Websocket

  • SSE 只能Server到Client單項(xiàng),而Websocket是雙向通信。
  • SSE 比 Websocket 輕量。當(dāng)然功能要簡(jiǎn)單的多。開(kāi)發(fā)便利,不牽涉協(xié)議升級(jí)問(wèn)題。
  • SSE 天然支持?jǐn)嗑€(xiàn)重連

3.Spring Mvc中的SSE

Spring Mvc對(duì)SSE進(jìn)行了支持。如果你要聲明一個(gè)SSE連接。只需要在你的控制器聲明一個(gè)如下接口:

Java服務(wù)端推送消息有那么難嗎?

 

必須必須返回SseEmitter對(duì)象,SseEmitter對(duì)象是Session級(jí)別的,如果你要點(diǎn)對(duì)點(diǎn)針對(duì)每個(gè)session要獨(dú)立存儲(chǔ)。如果你是廣播可以共用一個(gè)SseEmitter對(duì)象。按照SSE規(guī)范也必須聲明produces為"text/event-stream"。當(dāng)你調(diào)用該接口的時(shí)候?qū)⒔⑵餝SE連接。

你可以在另一個(gè)線(xiàn)程中調(diào)用SseEmitter的send方法向客戶(hù)端發(fā)送事件。你也可以在發(fā)送事件后調(diào)用complete方法來(lái)關(guān)閉SSE連接。

4.瀏覽器端的EventSource

由于SSE 是HTML5規(guī)范。所以對(duì)于App端必須有HTML才能支持。并且IE如果要支持需要使用一些兼容開(kāi)發(fā)包,比如polyfill庫(kù)。客戶(hù)端因?yàn)橹唤邮苁录蚤_(kāi)發(fā)比較簡(jiǎn)單:

  • 聲明客戶(hù)端連接, 初始化EventSource對(duì)象。
  • 編寫(xiě)監(jiān)聽(tīng)器來(lái)監(jiān)聽(tīng)事件。
Java服務(wù)端推送消息有那么難嗎?

 

今天介紹了SSE 服務(wù)端推送。和長(zhǎng)輪訓(xùn)、comet、websocket相比而言比較輕量級(jí)。在一些需要服務(wù)器實(shí)時(shí)推送規(guī)模不大的業(yè)務(wù)場(chǎng)景實(shí)現(xiàn)更簡(jiǎn)單點(diǎn)。相信看了本文后你會(huì)很快入門(mén)。在實(shí)際開(kāi)發(fā)中要根據(jù)業(yè)務(wù)對(duì)這幾種推送進(jìn)行技術(shù)選型。沒(méi)有最好的只有最適合的。SSE對(duì)大多數(shù)開(kāi)發(fā)者來(lái)說(shuō)不夠熟悉。

分享到:
標(biāo)簽:推送 消息 Java
用戶(hù)無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定