Spring Boot ‐ Server‐Sent Events - CCH0124/spring-sandbox GitHub Wiki
Server-Sent-Events(SSE)是一種 HTTP 標準,允許網頁應用程式處理單向事件流,並在伺服器發送數據時接收更新。
- SSE 使用 Webflux
使用 Reactor 或封裝 ServerSentEvent 實現。
@GetMapping(value = "volvo/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<Volvo> getJoke(){
return volvoPublisher
.publish()
.doOnNext(content -> {System.out.println(content);})
.doFinally(signalType -> System.out.println("Notification flux closed"))
;
}
@GetMapping(value = "volvo/streamsse", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<ServerSentEvent<String>> streamEvents(){
return Flux.interval(Duration.ofSeconds(1))
.map(sequence -> ServerSentEvent.<String> builder()
.id(String.valueOf(sequence))
.event("periodic-event")
.data("SSE - %s".formatted(LocalTime.now().toString())
)
.build());
}
使用 ServerSentEvent 實體有幾個好處:
- 可以處理實際場景中所需的事件元數據
- 可以忽略聲明 "text/event-stream" media type
- Spring MVC 使用 SSE
todo
SSE 是大多數瀏覽器所採用的規範,允許在任何時間單向用流傳輸事件。「事件」只是一個 UTF-8 編碼的文本數據流,遵循規範中定義的格式,該格式由一系列以換行符分隔的鍵值元素像是 id、retry、data 和 event 名稱等組成。此規範不限制數據 payload 格式。可以使用簡單的字串或更複雜的 JSON 或 XML 結構。
最後考慮 SSE 和 WebSocket 之間的區別。
- WebSocket 提供服務器和客戶端之間的全雙工通訊,而 SSE 則使用單向通訊。
- 此外,WebSocket 不是 HTTP 協議,與 SSE 相反,它不提供錯誤處理標準