最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Springboot?實(shí)現(xiàn)Server-Sent?Events的項(xiàng)目實(shí)踐

 更新時(shí)間:2024年12月24日 10:10:39   作者:it噩夢(mèng)  
本文介紹了在Spring?Boot中實(shí)現(xiàn)Server-Sent?Events(SSE),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

在 Spring Boot 中,返回 text/event-stream 類型的響應(yīng)通常用于實(shí)現(xiàn) Server-Sent Events (SSE),這種方式允許服務(wù)器推送實(shí)時(shí)更新到瀏覽器??蛻舳送ㄟ^(guò) EventSource API 監(jiān)聽并接收這些事件。Spring Boot 可以通過(guò)使用 @RestController 和 SseEmitter 來(lái)實(shí)現(xiàn)這一功能。

步驟 1:創(chuàng)建 SSE Controller 返回 text/event-stream

我們可以通過(guò) @GetMapping 來(lái)創(chuàng)建一個(gè) API,返回 text/event-stream 類型的數(shù)據(jù)。這個(gè)數(shù)據(jù)會(huì)是一個(gè)持續(xù)的流,瀏覽器會(huì)實(shí)時(shí)地接收它。

示例:通過(guò) Spring Boot 返回 text/event-stream 類型的響應(yīng)

  • 控制器:在 Spring Boot 中定義一個(gè)返回 text/event-stream 類型的 API 接口。
  • 使用 SseEmitterSseEmitter 是 Spring 提供的一個(gè)類,用于處理 Server-Sent Events 流。我們可以利用它來(lái)異步地向客戶端推送數(shù)據(jù)。

示例 1:簡(jiǎn)單的 SSE 實(shí)現(xiàn)

在這個(gè)示例中,我們將創(chuàng)建一個(gè)簡(jiǎn)單的 Spring Boot 控制器,該控制器將返回一個(gè)實(shí)時(shí)的事件流(SSE)。

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;

@RestController
public class SseController {

    /**
     * 這個(gè)接口會(huì)返回一個(gè)持續(xù)的事件流,瀏覽器會(huì)通過(guò) EventSource 接收
     */
    @GetMapping("/sse")
    public SseEmitter handleSse() {
        SseEmitter emitter = new SseEmitter();

        // 啟動(dòng)一個(gè)新的線程模擬定期推送事件
        new Thread(() -> {
            try {
                for (int i = 0; i < 10; i++) {
                    // 向客戶端發(fā)送數(shù)據(jù)
                    emitter.send("data: Event " + i + "\n\n");
                    Thread.sleep(1000); // 每秒發(fā)送一次
                }
                emitter.complete(); // 發(fā)送完畢后,標(biāo)記事件流完成
            } catch (Exception e) {
                emitter.completeWithError(e); // 如果出現(xiàn)異常,標(biāo)記事件流出錯(cuò)
            }
        }).start();

        return emitter; // 返回 SseEmitter 實(shí)例,它會(huì)處理異步流式數(shù)據(jù)
    }
}

說(shuō)明:

  • SseEmitter 用于處理 SSE 連接。我們將數(shù)據(jù)通過(guò) emitter.send() 發(fā)送到客戶端。
  • 事件通過(guò) data: <message> 格式發(fā)送給客戶端,注意每條消息以兩個(gè)換行符結(jié)束(\n\n)。
  • Thread.sleep(1000) 用于模擬每秒發(fā)送一個(gè)事件。如果你需要定期發(fā)送事件,可以通過(guò)類似的機(jī)制來(lái)實(shí)現(xiàn)。
  • 最后,通過(guò) emitter.complete() 標(biāo)記事件流結(jié)束。如果發(fā)生錯(cuò)誤,則使用 emitter.completeWithError()

步驟 2:前端接收 SSE 事件

在前端,使用 JavaScript 的 EventSource API 接收服務(wù)器推送的事件。這個(gè) API 會(huì)保持與服務(wù)器的連接,一旦有新的事件,瀏覽器會(huì)自動(dòng)處理。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Server-Sent Events Example</title>
</head>
<body>

<h1>Server-Sent Events Example</h1>
<div id="messages"></div>

<script>
    // 創(chuàng)建一個(gè) EventSource 對(duì)象,連接到 /sse 接口
    const eventSource = new EventSource("/sse");

    // 每當(dāng)接收到數(shù)據(jù)時(shí),處理該事件
    eventSource.onmessage = function(event) {
        const messagesDiv = document.getElementById('messages');
        const message = document.createElement('p');
        message.textContent = event.data;
        messagesDiv.appendChild(message);
    };

    // 錯(cuò)誤處理
    eventSource.onerror = function(error) {
        console.error("EventSource failed:", error);
    };
</script>

</body>
</html>

步驟 3:配置 Spring Boot 啟用異步支持

SSE 通常需要異步處理,因此在 Spring Boot 中啟用異步支持是非常重要的??梢酝ㄟ^(guò) @EnableAsync 來(lái)啟用異步支持。

啟用異步支持

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;

@Configuration
@EnableAsync
public class AsyncConfig {
}

步驟 4:定時(shí)推送數(shù)據(jù)(可選)

如果你希望定期推送事件(例如,每隔一定時(shí)間推送一個(gè)消息),可以使用 Spring 的 @Scheduled 注解來(lái)安排定時(shí)任務(wù)。

示例:定時(shí)發(fā)送事件

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Controller;

@Controller
public class ScheduledSseController {

    private final SseEmitter emitter = new SseEmitter();

    @Scheduled(fixedRate = 5000)  // 每5秒發(fā)送一個(gè)事件
    public void sendScheduledEvent() {
        try {
            emitter.send("data: Scheduled Event at " + System.currentTimeMillis() + "\n\n");
        } catch (IOException e) {
            emitter.completeWithError(e);
        }
    }
}

在上面的示例中,@Scheduled(fixedRate = 5000) 會(huì)定期每 5 秒發(fā)送一次事件。

步驟 5:處理多客戶端連接

如果你需要管理多個(gè)客戶端連接,可以將 SseEmitter 實(shí)例存儲(chǔ)在一個(gè)列表中,并為每個(gè)連接發(fā)送事件。每當(dāng)有新事件時(shí),你可以通過(guò)遍歷這些連接,發(fā)送事件到所有連接的客戶端。

import org.springframework.stereotype.Controller;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
import org.springframework.web.bind.annotation.GetMapping;

import java.io.IOException;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

@Controller
public class MultiClientSseController {

    private final List<SseEmitter> emitters = new CopyOnWriteArrayList<>();

    @GetMapping("/sse")
    public SseEmitter handleSse() {
        SseEmitter emitter = new SseEmitter();
        emitters.add(emitter);

        // 在新線程中發(fā)送數(shù)據(jù)
        new Thread(() -> {
            try {
                for (int i = 0; i < 10; i++) {
                    for (SseEmitter e : emitters) {
                        e.send("data: Event " + i + "\n\n");
                    }
                    Thread.sleep(1000); // 每秒發(fā)送一次
                }
            } catch (Exception e) {
                emitters.forEach(SseEmitter::completeWithError);
            }
        }).start();

        return emitter;
    }
}

總結(jié)

  • 返回 text/event-stream:在 Spring Boot 控制器中使用 SseEmitter 或直接通過(guò) @GetMapping 返回流式數(shù)據(jù)。
  • 前端接收事件:使用瀏覽器的 EventSource API 來(lái)接收事件流。
  • 定時(shí)事件:可以使用 @Scheduled 來(lái)定期推送事件,或者通過(guò)后臺(tái)線程推送動(dòng)態(tài)數(shù)據(jù)。
  • 多客戶端支持:可以管理多個(gè) SseEmitter 實(shí)例,為每個(gè)客戶端推送事件。

這種方式非常適合實(shí)時(shí)數(shù)據(jù)推送,例如股票行情更新、社交媒體通知、實(shí)時(shí)消息等應(yīng)用場(chǎng)景。

到此這篇關(guān)于Springboot 實(shí)現(xiàn)Server-Sent Events的項(xiàng)目實(shí)踐的文章就介紹到這了,更多相關(guān)Springboot實(shí)現(xiàn)Server-Sent Events內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 從0到1構(gòu)建springboot web應(yīng)用鏡像并使用容器部署的過(guò)程

    從0到1構(gòu)建springboot web應(yīng)用鏡像并使用容器部署的過(guò)程

    這篇文章主要介紹了從0到1構(gòu)建springboot web應(yīng)用鏡像并使用容器部署,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • 圖文詳解Maven工程打jar包的N種方式

    圖文詳解Maven工程打jar包的N種方式

    最近在打包maven項(xiàng)目時(shí),該項(xiàng)目中僅有一個(gè)測(cè)試類,想打成jar包運(yùn)行測(cè)試,所以下面這篇文章主要給大家介紹了關(guān)于Maven工程打jar包的N種方式,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • 解決IDEA中不能正常輸入光標(biāo)變粗的問(wèn)題

    解決IDEA中不能正常輸入光標(biāo)變粗的問(wèn)題

    這篇文章主要介紹了在IDEA中不能正常輸入光標(biāo)變粗的解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2020-09-09
  • 基于SpringBoot項(xiàng)目遇到的坑--Date入?yún)?wèn)題

    基于SpringBoot項(xiàng)目遇到的坑--Date入?yún)?wèn)題

    這篇文章主要介紹了SpringBoot項(xiàng)目遇到的坑--Date入?yún)?wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • spring+maven實(shí)現(xiàn)發(fā)送郵件功能

    spring+maven實(shí)現(xiàn)發(fā)送郵件功能

    這篇文章主要為大家詳細(xì)介紹了spring+maven實(shí)現(xiàn)發(fā)送郵件功能,利用spring提供的郵件工具來(lái)發(fā)送郵件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • SpringBoot使用LomBok的示例代碼

    SpringBoot使用LomBok的示例代碼

    這篇文章主要介紹了SpringBoot使用LomBok的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • 使用1招搞定maven打包空間不足的問(wèn)題

    使用1招搞定maven打包空間不足的問(wèn)題

    這篇文章主要介紹了使用1招搞定maven打包空間不足的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-09-09
  • Java gRPC攔截器簡(jiǎn)單實(shí)現(xiàn)分布式日志鏈路追蹤器過(guò)程詳解

    Java gRPC攔截器簡(jiǎn)單實(shí)現(xiàn)分布式日志鏈路追蹤器過(guò)程詳解

    有請(qǐng)求的發(fā)送、處理,當(dāng)然就會(huì)有攔截器的需求,例如在服務(wù)端通過(guò)攔截器統(tǒng)一進(jìn)行請(qǐng)求認(rèn)證等操作,這些就需要攔截器來(lái)完成,今天松哥先和小伙伴們來(lái)聊一聊gRPC中攔截器的基本用法,后面我再整一篇文章和小伙伴們做一個(gè)基于攔截器實(shí)現(xiàn)的JWT認(rèn)證的gRPC
    2023-03-03
  • Java總結(jié)篇系列:Java泛型詳解

    Java總結(jié)篇系列:Java泛型詳解

    下面小編就為大家?guī)?lái)一篇Java總結(jié)篇系列:Java泛型詳解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-09-09
  • FastJson對(duì)于JSON格式字符串、JSON對(duì)象及JavaBean之間的相互轉(zhuǎn)換操作

    FastJson對(duì)于JSON格式字符串、JSON對(duì)象及JavaBean之間的相互轉(zhuǎn)換操作

    這篇文章主要介紹了FastJson對(duì)于JSON格式字符串、JSON對(duì)象及JavaBean之間的相互轉(zhuǎn)換,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-11-11

最新評(píng)論

盘锦市| 新绛县| 黔江区| 长丰县| 洛浦县| 七台河市| 广河县| 灵石县| 扎鲁特旗| 宁德市| 永定县| 上杭县| 绥宁县| 平顶山市| 英吉沙县| 扬州市| 长丰县| 牡丹江市| 博爱县| 思茅市| 名山县| 鲁甸县| 贵港市| 汝城县| 上杭县| 栾城县| 江孜县| 来凤县| 珲春市| 禄劝| 丰都县| 平邑县| 屏南县| 微博| 简阳市| 通化市| 运城市| 泌阳县| 台东县| 胶南市| 达孜县|