
HTML服務(wù)器發(fā)送事件(ServerSent Events,服務(wù)簡(jiǎn)稱(chēng)SSE??)是送事一種允許服務(wù)器向客戶(hù)端推送實(shí)時(shí)更新的技術(shù),這種技術(shù)在Web應用中非常有用,服務(wù)例如實(shí)時(shí)聊天、送事股票行情、服務(wù)新聞推送等場(chǎng)景,送事在Spring MVC中,服務(wù)我們可以使用SseEmitter類(lèi)來(lái)實(shí)現服務(wù)器??發(fā)(′?`*)送事件。送事
本文將詳細介紹如何在Spring MVC中使用HTML服務(wù)器發(fā)送事件,送事我們需要創(chuàng )建一個(gè)Spring MVC項目,服務(wù)(′?_?`)并添加相關(guān)依賴(lài),送事我們將編寫(xiě)一個(gè)簡(jiǎn)單的服務(wù)控制器來(lái)處理(???)客戶(hù)端的請求,并使用SseEmitter向客戶(hù)端發(fā)送實(shí)時(shí)更新,送事我們將編寫(xiě)一個(gè)簡(jiǎn)單的服務(wù)HTML頁(yè)面來(lái)接收服務(wù)器發(fā)送的事件。
1、創(chuàng )建??Spring MVC項目
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>springbootstarterweb</artifactId> </dependency> <dependency> <groupId>org.springframework.b(′?_?`)oot</groupId> <artifactId>(╯°□°)╯springbootstarterwebsocket</artifac??tId> </dependency></dependencies>
2、編寫(xiě)控制器
接下來(lái),我們編寫(xiě)一個(gè)名為EventController的控制器類(lèi),用于處理客戶(hù)端的請求,在這個(gè)類(lèi)中,我們將使用SseEmitter向客戶(hù)端發(fā)送實(shí)時(shí)更新。
import org.springframework.web.bin??d.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;impor(′?ω?`)t java.io.IOException;impor(′ω`)t java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;@RestControllerpublic class EventController { private final ExecutorService nonBlockingService = Executors.ne(╯°□°)╯wCac??hedThreadPool(); private SseEmitter emitter = new SseEmitter(); @GetMapping("/events") public Sseヽ(′ー`)ノEmitter getEvents() throws IOException { System.out.printl??n("Client connected"); emitter = new SseEmi??tter(); nonBlockingService.execute(() > { try { for (int i = 0; i < 10; i++) { TimeUnit.SECONDS.sleep(1); emitter.(′?_?`)send("Event "(°o°); + i); } } catch (IOException | InterruptedException e) { emitter.completeWithError(e); } finally { try { emitter.complete(); } catch (IOExcep??tion e) { emitter.completeWithError(e); } } }); return emitter; }}在上面(mian)的代碼中,我們首先創(chuàng )建了一個(gè)名為EventController的控制器類(lèi),并使用@RestController注解標記它,我們定義了一個(gè)名為getE(′▽?zhuān)?)vents的方法,該方法使用@GetMapping("/events")注解映射到客戶(hù)端的請求,在這個(gè)方法中,我們創(chuàng )建了一個(gè)SseEmitter對象,并使用一個(gè)非阻塞線(xiàn)程池來(lái)執行定時(shí)任務(wù),每隔1秒,我們就向客戶(hù)端發(fā)送一個(gè)事件,事件的內容為"Event "加上當前的計數值,??當所有事件都發(fā)送完畢后,我們調(diao)用emitter.complete()方法關(guān)(T_T)閉連接,如果在發(fā)送過(guò)程中發(fā)生異常,我們調用emitter.completeWithError()方法將異常傳遞給客戶(hù)端。
3、編寫(xiě)HTML頁(yè)面(mian)
我們編寫(xiě)一個(gè)簡(jiǎn)單的HTML頁(yè)面來(lái)接收服務(wù)器發(fā)送的事件,在這個(gè)頁(yè)面中,我們使用JavaScript的Eve??ntSource對象來(lái)監聽(tīng)服務(wù)器發(fā)送ヾ(′▽?zhuān)??的事件,當??收到事件時(shí),我們將事件內容??顯示在一個(gè)名為eventOutput的<div>元素中。
<!DOCTYPE html><html lang(′ω`*)="en"><head> <meta charset="UTF8"> <ti??tle>(′ω`);ServerSent Events Example</title> <script src="https://code.jquery(T_T).com/jquery3.6.0.min.js"></script></head>&l??t;body&gヾ(′?`)?t; <h1>ServerSent Events Example</h1> <div?? id="eventOutput??"></div> <script> var so(′?_?`)urce = new EventSource("/events"); source.onmessage = function (event) { $("#eventOutput").app(′ω`*)end(&(′?_?`)quot;<p>" + event.data + "</p>"); }; source.onerror = function (error) { console.error("ヽ(′▽?zhuān)?ノ;Error occurred:", error); }; </script></body></html&?gt;在上面的代碼中,我們首先引入了jQuery庫和EventSource對象,我們創(chuàng )建了一個(gè)名為sour??ce的EventSource對象,并將其連接到服務(wù)器的"/events"端點(diǎn),當收到服務(wù)器發(fā)送的事件時(shí),我們將事件內容添加到名┐(′д`)┌為eventOutput的<?;div>元素中,如果在連接過(guò)程中發(fā)生錯誤,我們將錯誤信息輸出到控制臺。