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

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

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

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

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

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

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

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

示例 1:簡單的 SSE 實現(xiàn)

在這個示例中,我們將創(chuàng)建一個簡單的 Spring Boot 控制器,該控制器將返回一個實時的事件流(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 {

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

        // 啟動一個新的線程模擬定期推送事件
        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)記事件流出錯
            }
        }).start();

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

說明:

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

步驟 2:前端接收 SSE 事件

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

<!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)建一個 EventSource 對象,連接到 /sse 接口
    const eventSource = new EventSource("/sse");

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

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

</body>
</html>

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

SSE 通常需要異步處理,因此在 Spring Boot 中啟用異步支持是非常重要的。可以通過 @EnableAsync 來啟用異步支持。

啟用異步支持

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

@Configuration
@EnableAsync
public class AsyncConfig {
}

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

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

示例:定時發(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ā)送一個事件
    public void sendScheduledEvent() {
        try {
            emitter.send("data: Scheduled Event at " + System.currentTimeMillis() + "\n\n");
        } catch (IOException e) {
            emitter.completeWithError(e);
        }
    }
}

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

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

如果你需要管理多個客戶端連接,可以將 SseEmitter 實例存儲在一個列表中,并為每個連接發(fā)送事件。每當(dāng)有新事件時,你可以通過遍歷這些連接,發(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 或直接通過 @GetMapping 返回流式數(shù)據(jù)。
  • 前端接收事件:使用瀏覽器的 EventSource API 來接收事件流。
  • 定時事件:可以使用 @Scheduled 來定期推送事件,或者通過后臺線程推送動態(tài)數(shù)據(jù)。
  • 多客戶端支持:可以管理多個 SseEmitter 實例,為每個客戶端推送事件。

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

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

相關(guān)文章

  • 將本地JAR文件手動添加到Maven本地倉庫的實現(xiàn)過程

    將本地JAR文件手動添加到Maven本地倉庫的實現(xiàn)過程

    在Java開發(fā)中,使用Maven作為項目管理工具已經(jīng)成為了主流的選擇,Maven提供了強大的依賴管理功能,可以輕松地下載和管理項目所需的庫和工具,在某些情況下,你可能會需要將本地下載的JAR文件手動添加到Maven的本地倉庫中,這篇博客將詳細(xì)介紹如何實現(xiàn)這一過程
    2024-10-10
  • Java實戰(zhàn)之實現(xiàn)一個好用的MybatisPlus代碼生成器

    Java實戰(zhàn)之實現(xiàn)一個好用的MybatisPlus代碼生成器

    這篇文章主要介紹了Java實戰(zhàn)之實現(xiàn)一個好用的MybatisPlus代碼生成器,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • 如何解決TCP?socket的阻塞問題

    如何解決TCP?socket的阻塞問題

    這篇文章主要介紹了如何解決TCP?socket的阻塞問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java并發(fā)Timer源碼分析

    Java并發(fā)Timer源碼分析

    這篇文章講述了java并發(fā)編程的相關(guān)知識點,并通過Timer源碼分析更深入的講解了java并發(fā)編程。
    2018-07-07
  • Java常見問題之javac Hello.java找不到文件的解決方法

    Java常見問題之javac Hello.java找不到文件的解決方法

    剛開始編寫java代碼時,肯定會遇到各種各樣的bug,當(dāng)然對于初學(xué)者這也是能理解的,下面這篇文章主要給大家介紹了關(guān)于Java常見問題之javac Hello.java找不到文件解決的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下。
    2018-01-01
  • java讀取文件:char的ASCII碼值=65279,顯示是一個空字符的解決

    java讀取文件:char的ASCII碼值=65279,顯示是一個空字符的解決

    這篇文章主要介紹了java讀取文件:char的ASCII碼值=65279,顯示是一個空字符的解決,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • springboot的@Value中#和$區(qū)別詳解

    springboot的@Value中#和$區(qū)別詳解

    這篇文章主要介紹了springboot的@Value中#和$區(qū)別詳解,@Value注解的作用主要可以給屬性直接賦值、也可以讀取配置文件中的值給屬性賦值,需要的朋友可以參考下
    2023-11-11
  • JavaWeb Session 會話管理實例詳解

    JavaWeb Session 會話管理實例詳解

    這篇文章主要介紹了JavaWeb Session 會話管理的相關(guān)資料,非常不錯,具有參考借鑒價值,感興趣的朋友一起看看吧
    2016-09-09
  • springboot-mongodb的多數(shù)據(jù)源配置的方法步驟

    springboot-mongodb的多數(shù)據(jù)源配置的方法步驟

    這篇文章主要介紹了springboot-mongodb的多數(shù)據(jù)源配置的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 使用Java編寫控制JDBC連接、執(zhí)行及關(guān)閉的工具類

    使用Java編寫控制JDBC連接、執(zhí)行及關(guān)閉的工具類

    這篇文章主要介紹了如何使用Java來編寫控制JDBC連接、執(zhí)行及關(guān)閉的程序,包括一個針對各種數(shù)據(jù)庫通用的釋放資源的工具類的寫法,需要的朋友可以參考下
    2016-03-03

最新評論