欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring?Boot?3.4.3?基于?Spring?WebFlux?實(shí)現(xiàn)?SSE?功能(代碼示例)

 更新時(shí)間:2025年04月01日 09:50:06   作者:Joyous  
Spring Boot 3.4.3 結(jié)合Spring WebFlux實(shí)現(xiàn)SSE 功能,為實(shí)時(shí)數(shù)據(jù)推送提供了優(yōu)雅的解決方案,通過(guò)本文的步驟,你可以快速搭建一個(gè)基于事件驅(qū)動(dòng)的后端服務(wù),滿(mǎn)足實(shí)時(shí)通知或監(jiān)控等需求,感興趣的朋友一起看看吧

在現(xiàn)代 Web 應(yīng)用開(kāi)發(fā)中,實(shí)時(shí)數(shù)據(jù)推送已成為許多業(yè)務(wù)場(chǎng)景的核心需求,例如實(shí)時(shí)通知、股票價(jià)格更新或在線(xiàn)聊天等。傳統(tǒng)的輪詢(xún)方式效率低下,而 SSE(Server-Sent Events,服務(wù)器推送事件)作為 HTML5 提供的一種輕量級(jí)技術(shù),能夠通過(guò)單向長(zhǎng)連接實(shí)現(xiàn)服務(wù)器到客戶(hù)端的實(shí)時(shí)數(shù)據(jù)推送。Spring Boot 3.4.3 結(jié)合 Spring WebFlux,為開(kāi)發(fā)者提供了響應(yīng)式編程能力,使得實(shí)現(xiàn) SSE 功能更加簡(jiǎn)單高效。本文將詳細(xì)介紹如何在 Spring Boot 3.4.3 中基于 Spring WebFlux 實(shí)現(xiàn) SSE 功能,并提供完整的代碼示例,助你在企業(yè)級(jí)應(yīng)用中快速落地實(shí)時(shí)推送需求。

1. SSE 簡(jiǎn)介

1.1 什么是 SSE?

SSE(Server-Sent Events)是一種基于 HTTP 協(xié)議的服務(wù)器推送技術(shù),允許服務(wù)器主動(dòng)向客戶(hù)端發(fā)送數(shù)據(jù)??蛻?hù)端通過(guò)建立長(zhǎng)連接接收服務(wù)器推送的事件流,適用于需要實(shí)時(shí)更新的場(chǎng)景。與 WebSocket 相比,SSE 是單向通信(僅服務(wù)器到客戶(hù)端),實(shí)現(xiàn)更簡(jiǎn)單,且瀏覽器原生支持。

1.2 SSE 的優(yōu)點(diǎn)

  • 輕量級(jí):基于 HTTP,無(wú)需額外協(xié)議支持。
  • 簡(jiǎn)單性:實(shí)現(xiàn)成本低,適合單向推送場(chǎng)景。
  • 自動(dòng)重連:客戶(hù)端斷開(kāi)后可自動(dòng)嘗試重連。
  • 兼容性:HTML5 標(biāo)準(zhǔn),主流瀏覽器均支持。

1.3 適用場(chǎng)景

  • 實(shí)時(shí)通知(如消息提醒)。
  • 數(shù)據(jù)監(jiān)控(如服務(wù)器狀態(tài)更新)。
  • 單向事件流(如日志推送)。

2. Spring WebFlux 簡(jiǎn)介

Spring WebFlux 是 Spring 5 引入的響應(yīng)式 Web 框架,與傳統(tǒng)的 Spring MVC 不同,它基于 Reactor 項(xiàng)目,支持異步非阻塞的編程模型。Spring Boot 3.4.3 默認(rèn)集成了 Spring WebFlux,使得開(kāi)發(fā)者可以輕松構(gòu)建高并發(fā)、事件驅(qū)動(dòng)的應(yīng)用。結(jié)合 SSE,WebFlux 的 Flux 數(shù)據(jù)流非常適合處理實(shí)時(shí)推送需求。

3. 項(xiàng)目實(shí)戰(zhàn)

以下是基于 Spring Boot 3.4.3 和 Spring WebFlux 實(shí)現(xiàn) SSE 功能的完整步驟。

3.1 添加 Maven 依賴(lài)

pom.xml 中添加 Spring WebFlux 的依賴(lài):

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.4.3</version>
    </parent>
    <artifactId>springboot-sse</artifactId>
    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
        </dependency>
    </dependencies>
</project>

說(shuō)明:

  • spring-boot-starter-webflux 提供了 WebFlux 的核心功能和 Reactor 依賴(lài)。
  • Spring Boot 3.4.3 使用 JDK 17,確保編譯器版本匹配。

3.2 創(chuàng)建 SSE 控制器

創(chuàng)建一個(gè)控制器,用于推送事件流:

package cn.joyous.sse.controller;
import org.springframework.http.MediaType;
import org.springframework.http.codec.ServerSentEvent;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;
import java.time.Duration;
import java.util.concurrent.atomic.AtomicInteger;
/**
 */
@RestController
public class SSEController {
    // 定義一個(gè)計(jì)數(shù)器,用于模擬數(shù)據(jù)變化
    private final AtomicInteger counter = new AtomicInteger(0);
    @GetMapping(path = "/sse", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<ServerSentEvent<Integer>> streamEvents() {
        return Flux.interval(Duration.ofSeconds(1))
                .map(seq -> ServerSentEvent.<Integer>builder()
                        .id(String.valueOf(seq))
                        .event("message")
                        .data(counter.incrementAndGet())
                        .build());
    }
}

代碼說(shuō)明:

  • @GetMapping(produces = MediaType.TEXT_EVENT_STREAM_VALUE):指定返回 SSE 事件流。
  • Flux.interval(Duration.ofSeconds(1)):每秒生成一個(gè)事件。
  • ServerSentEvent.builder():構(gòu)造 SSE 事件,包含 id(事件標(biāo)識(shí))、event(事件類(lèi)型)和 data(推送數(shù)據(jù))。

3.3 前端頁(yè)面示例

創(chuàng)建一個(gè)簡(jiǎn)單的 HTML 頁(yè)面,用于接收 SSE 數(shù)據(jù):

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>SSE Demo</title>
</head>
<body>
    <h1>SSE 數(shù)據(jù)推送</h1>
    <div id="result"></div>
    <script>
        const eventSource = new EventSource("http://localhost:8080/sse");
        eventSource.onmessage = function(event) {
            document.getElementById("result").innerText += "收到數(shù)據(jù): " + event.data + "\n";
        };
        eventSource.onerror = function() {
            console.log("SSE 連接失敗");
            eventSource.close();
        };
    </script>
</body>
</html>

保存為 sse.html,放置在 src/main/resources/static 目錄下。

3.4 啟動(dòng)與測(cè)試

  • 啟動(dòng) Spring Boot 應(yīng)用。
  • 在瀏覽器中訪(fǎng)問(wèn) http://localhost:8080/sse.html,你將看到頁(yè)面每秒更新一次計(jì)數(shù)器數(shù)據(jù)。
  • 或者直接訪(fǎng)問(wèn) http://localhost:8080/sse,查看原始事件流:
id: 0
event: message
data: 1
id: 1
event: message
data: 2

4. 進(jìn)階功能(可選)

自定義事件類(lèi)型
修改控制器支持多種事件:

@GetMapping(path = "/sse", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<ServerSentEvent<String>> streamEvents() {
    return Flux.interval(Duration.ofSeconds(1))
            .map(seq -> ServerSentEvent.<String>builder()
                    .id(String.valueOf(seq))
                    .event(seq % 2 == 0 ? "even" : "odd")
                    .data("Count: " + counter.incrementAndGet())
                    .build());
}

動(dòng)態(tài)推送特定用戶(hù)
使用 Map 存儲(chǔ)用戶(hù)連接:

private final Map<String, Sinks.Many<String>> userSinks = new ConcurrentHashMap<>();
@GetMapping("/sse/{userId}")
public Flux<ServerSentEvent<String>> userStream(@PathVariable String userId) {
    Sinks.Many<String> sink = userSinks.computeIfAbsent(userId, k -> Sinks.many().multicast().onBackpressureBuffer());
    return sink.asFlux().map(data -> ServerSentEvent.builder().data(data).build());
}

異常處理
添加錯(cuò)誤重連邏輯:

return Flux.interval(Duration.ofSeconds(1))
        .map(seq -> ServerSentEvent.<Integer>builder().data(counter.incrementAndGet()).build())
        .onErrorResume(e -> Flux.just(ServerSentEvent.builder().data("Error: " + e.getMessage()).build()));

5. 總結(jié)

Spring Boot 3.4.3 結(jié)合 Spring WebFlux 實(shí)現(xiàn) SSE 功能,為實(shí)時(shí)數(shù)據(jù)推送提供了優(yōu)雅的解決方案。通過(guò)本文的步驟,你可以快速搭建一個(gè)基于事件驅(qū)動(dòng)的后端服務(wù),滿(mǎn)足實(shí)時(shí)通知或監(jiān)控等需求。相比 WebSocket,SSE 更輕量且易于集成,適合單向推送場(chǎng)景。

到此這篇關(guān)于Spring Boot 3.4.3 基于 Spring WebFlux 實(shí)現(xiàn) SSE 功能的文章就介紹到這了,更多相關(guān)Spring Boot   Spring WebFlux SSE內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java?NIO通信基礎(chǔ)示例詳解

    Java?NIO通信基礎(chǔ)示例詳解

    這篇文章主要為大家介紹了Java?NIO通信基礎(chǔ)使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Java設(shè)計(jì)模式以虹貓藍(lán)兔的故事講解橋接模式

    Java設(shè)計(jì)模式以虹貓藍(lán)兔的故事講解橋接模式

    橋接是用于把抽象化與實(shí)現(xiàn)化解耦,使二者可以獨(dú)立變化。這種類(lèi)型的設(shè)計(jì)模式屬于結(jié)構(gòu)型模式,它通過(guò)提供抽象化和實(shí)現(xiàn)化之間的橋接結(jié)構(gòu),來(lái)實(shí)現(xiàn)二者的解耦。這種模式涉及到一個(gè)作為橋接的接口,使得實(shí)體類(lèi)的功能獨(dú)立于接口實(shí)現(xiàn)類(lèi)。這兩種類(lèi)型的類(lèi)可被結(jié)構(gòu)化改變而互不影響
    2022-04-04
  • 10個(gè)經(jīng)典的Java main方法面試題

    10個(gè)經(jīng)典的Java main方法面試題

    這篇文章主要為大家分享了10個(gè)經(jīng)典的Java main方法面試題,與其說(shuō)是Java面試題,其實(shí)也是Java的一些最基礎(chǔ)知識(shí)問(wèn)題,感興趣的小伙伴們可以參考一下
    2016-01-01
  • Spring?main方法中如何調(diào)用Dao層和Service層的方法

    Spring?main方法中如何調(diào)用Dao層和Service層的方法

    這篇文章主要介紹了Spring?main方法中調(diào)用Dao層和Service層的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Mybatis批量操作sql寫(xiě)法示例(批量新增、更新)

    Mybatis批量操作sql寫(xiě)法示例(批量新增、更新)

    Mybatis技術(shù),現(xiàn)在是工作中使用頻率越來(lái)越高,我們?cè)趯?duì)數(shù)據(jù)庫(kù)進(jìn)行操作的時(shí)候,經(jīng)常會(huì)遇到批量操作的需求,這篇文章主要給大家介紹了關(guān)于Mybatis批量操作sql寫(xiě)法的相關(guān)資料,需要的朋友可以參考下
    2021-05-05
  • springboot搭建訪(fǎng)客管理系統(tǒng)的實(shí)現(xiàn)示例

    springboot搭建訪(fǎng)客管理系統(tǒng)的實(shí)現(xiàn)示例

    這篇文章主要介紹了springboot搭建訪(fǎng)客管理系統(tǒng)的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 升級(jí)springboot3之自動(dòng)配置導(dǎo)入失效問(wèn)題及解決

    升級(jí)springboot3之自動(dòng)配置導(dǎo)入失效問(wèn)題及解決

    這篇文章主要介紹了升級(jí)springboot3之自動(dòng)配置導(dǎo)入失效問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Jenkins自動(dòng)部署Net Core過(guò)程圖解

    Jenkins自動(dòng)部署Net Core過(guò)程圖解

    這篇文章主要介紹了Jenkins自動(dòng)部署Net Core過(guò)程圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-12-12
  • Mybatis自關(guān)聯(lián)查詢(xún)一對(duì)多查詢(xún)的實(shí)現(xiàn)示例

    Mybatis自關(guān)聯(lián)查詢(xún)一對(duì)多查詢(xún)的實(shí)現(xiàn)示例

    這篇文章主要介紹了Mybatis自關(guān)聯(lián)查詢(xún)一對(duì)多查詢(xún)的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • 在同一個(gè)類(lèi)中調(diào)用帶有@Transactional注解的方法示例

    在同一個(gè)類(lèi)中調(diào)用帶有@Transactional注解的方法示例

    這篇文章主要為大家介紹了在同一個(gè)類(lèi)中調(diào)用帶有@Transactional注解的方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04

最新評(píng)論