實現實時數據推送:SpringBoot中SSE接口的兩種方法

🌟 前言

歡迎來到我的技術小宇宙!🌌 這里不僅是我記錄技術點滴的后花園,也是我分享學習心得和項目經驗的樂園。📚 無論你是技術小白還是資深大牛,這里總有一些內容能觸動你的好奇心。🔍

  • 🤖 洛可可白:個人主頁

  • 🔥 個人專欄:?前端技術 ?后端技術

  • 🏠 個人博客:洛可可白博客

  • 🐱 代碼獲取:bestwishes0203

  • 📷 封面壁紙:洛可可白wallpaper

在這里插入圖片描述

SpringBoot中SSE接口的兩種方法

  • 實現實時數據推送:SpringBoot中SSE接口的兩種方法
    • 一、什么是SSE?
    • 二、項目環境準備
      • 1. 基礎依賴
    • 三、兩種實現方式對比
    • 四、傳統Servlet實現(基于SseEmitter)
      • 1. 控制器實現
      • 2. 關鍵點解析
    • 五、響應式實現(基于WebFlux)
      • 1. 控制器實現
      • 2. 核心優勢
    • 六、接口測試方法
      • 1. 使用curl測試
      • 2. 前端示例
    • 七、生產環境注意事項
    • 八、擴展應用場景
    • 九、總結

實現實時數據推送:SpringBoot中SSE接口的兩種方法

一、什么是SSE?

SSE(Server-Sent Events) 是一種基于HTTP的服務器向客戶端單向實時推送數據的技術。與WebSocket不同,SSE天然支持斷線重連,且協議簡單,適用于股票行情、實時日志、消息通知等場景。


二、項目環境準備

1. 基礎依賴

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency><!-- 若使用WebFlux方式 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

三、兩種實現方式對比

特性傳統Servlet方式WebFlux響應式方式
線程模型阻塞IO(線程池)非阻塞IO(事件循環)
資源消耗較高較低
代碼復雜度需手動管理線程聲明式編程
適用場景簡單低頻場景高并發實時場景

四、傳統Servlet實現(基于SseEmitter)

1. 控制器實現

@RestController
public class SseController {@GetMapping("/sse")public SseEmitter handleSse() {SseEmitter emitter = new SseEmitter();ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();Runnable task = () -> {try {String data = "Time: " + LocalDateTime.now();emitter.send(SseEmitter.event().data(data).id(String.valueOf(System.currentTimeMillis())));} catch (IOException e) {emitter.completeWithError(e);executor.shutdown();}};// 定時發送(立即執行,每秒一次)executor.scheduleAtFixedRate(task, 0, 1, TimeUnit.SECONDS);// 客戶端斷開處理emitter.onCompletion(executor::shutdown);emitter.onTimeout(executor::shutdown);return emitter;}
}

2. 關鍵點解析

  • SseEmitter:核心類,保持長連接
  • ScheduledExecutorService:定時任務線程池
  • 事件結構:支持設置id/event/data等字段
  • 資源釋放:通過onCompletion/onTimeout確保線程池關閉

五、響應式實現(基于WebFlux)

1. 控制器實現

@RestController
public class SseWebFluxController {@GetMapping(value = "/sse-stream", 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("time-update").data("SSE from WebFlux - " + LocalDateTime.now()).build());}
}

2. 核心優勢

  • 非阻塞IO:基于Reactor庫實現響應式流
  • 自動背壓:處理客戶端消費速度差異
  • 簡潔API:使用Flux流式編程

六、接口測試方法

1. 使用curl測試

curl http://localhost:8080/sse
curl http://localhost:8080/sse-stream

2. 前端示例

<script>
const eventSource = new EventSource('/sse');eventSource.onmessage = (e) => {console.log('Received:', e.data);
};eventSource.addEventListener('time-update', (e) => {console.log('Custom event:', e.data);
});
</script>

七、生產環境注意事項

  1. 連接管理:設置合理的超時時間(默認30秒)

  2. 錯誤處理:添加onError回調記錄異常

  3. 跨域配置:需要配置CORS

    @Configuration
    public class WebConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/sse*").allowedOrigins("*");}
    }
    
  4. 性能監控:跟蹤活躍連接數


八、擴展應用場景

  1. 實時股票報價推送
  2. 系統運行狀態監控
  3. 聊天應用消息通知
  4. 長耗時任務進度更新

九、總結

兩種實現方式各有優勢:

  • 傳統Servlet方式 適合簡單場景,快速實現
  • WebFlux方式 更適合高并發、低延遲需求

建議根據實際場景選擇,對于新項目推薦使用WebFlux實現,能更好地利用系統資源。希望本文能幫助您快速上手SpringBoot中的SSE開發!


源碼地址:https://gitee.com/bestwishes0203

如果對你有幫助,點贊👍、收藏💖、關注🔔是我更新的動力!👋🌟🚀

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/899836.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/899836.shtml
英文地址,請注明出處:http://en.pswp.cn/news/899836.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LXC 導入多Linux系統

前提要求 ubuntu下安裝lxd 參考Rockylinux下安裝lxd 參考LXC 源替換參考LXC 容器端口發布參考LXC webui 管理<

ES的文檔更新機制

想獲取更多高質量的Java技術文章&#xff1f;歡迎訪問Java技術小館官網&#xff0c;持續更新優質內容&#xff0c;助力技術成長 Java技術小館官網https://www.yuque.com/jtostring ES的文檔更新機制 在現代應用中&#xff0c;數據的動態性越來越強&#xff0c;我們不僅需要快…

trae.ai 編輯器:前端開發者的智能效率革命

一、為什么我們需要更智能的編輯器&#xff1f; 作為從業5年的前端開發者&#xff0c;我使用過從Sublime到VSCode的各種編輯器。但隨著現代前端技術的復雜度爆炸式增長&#xff08;想想一個React組件可能涉及JSX、CSS-in-JS、TypeScript和GraphQL&#xff09;&#xff0c;傳統…

MySQL篇(一):慢查詢定位及索引、B樹相關知識詳解

MySQL篇&#xff08;一&#xff09;&#xff1a;慢查詢定位及索引、B樹相關知識詳解 MySQL篇&#xff08;一&#xff09;&#xff1a;慢查詢定位及索引、B樹相關知識詳解一、MySQL中慢查詢的定位&#xff08;一&#xff09;慢查詢日志的開啟&#xff08;二&#xff09;慢查詢日…

uniapp APP端在線升級(簡版)

設計思路&#xff1a; 1.版本比較&#xff1a;應用程序檢查其當前版本與遠程服務器上可用的最新版本 2. 更新狀態指示&#xff1a;如果應用程序是不是最新的版本&#xff0c;則頁面提示下載最新版本。 3.下載啟動&#xff1a;通過plus.downloader.createDownload()啟動新應用…

基于javaweb的SpringBoot教務課程管理設計與實現(源碼+文檔+部署講解)

技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、小程序、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;免費功能設計、開題報告、任務書、中期檢查PPT、系統功能實現、代碼編寫、論文編寫和輔導、論文…

使用大語言模型進行Python圖表可視化

Python使用matplotlib進行可視化一直有2個問題&#xff0c;一是代碼繁瑣&#xff0c;二是默認模板比較丑。因此發展出seaborn等在matplotlib上二次開發&#xff0c;以更少的代碼進行畫圖的和美化的庫&#xff0c;但是這也帶來了定制化不足的問題。在大模型時代&#xff0c;這個…

【JavaEE】MyBatis - Plus

目錄 一、快速使用二、CRUD簡單使用三、常見注解3.1 TableName3.2 TableFiled3.3 TableId 四、條件構造器4.1 QueryWrapper4.2 UpdateWrapper4.3 LambdaQueryWrapper4.4 LambdaUpdateWrapper 五、自定義SQL 一、快速使用 MyBatis Plus官方文檔&#xff1a;MyBatis Plus官方文檔…

采用前端技術開源了一個數據結構算法的可視化工具

今天要推薦的開源項目叫VisuAlgoX,是一個面向計算機科學和游戲開發的 交互式算法可視化工具&#xff0c;幫助用戶通過直觀的動畫理解各種數據結構和算法。 項目的前身 由于最近在做一些關于游戲和圖形化方面的文章&#xff0c;因此做了一部分相關算法的動態可視化來做配圖展示…

體驗智譜清言的AutoGLM進行自動化的操作(Chrome插件)

最近體驗了很多的大模型&#xff0c;大模型我是一直關注著ChatGLM&#xff0c;因為它確實在7b和8b這檔模型里&#xff0c;非常聰明&#xff01; 最近還體驗了很多大模型的應用軟件&#xff0c;比如Agently、5ire、 mcphost、 Dive、 NextChat等。但是這些一般都是圖形界面或者…

pytorch中dataloader自定義數據集

前言 在深度學習中我們需要使用自己的數據集做訓練&#xff0c;因此需要將自定義的數據和標簽加載到pytorch里面的dataloader里&#xff0c;也就是自實現一個dataloader。 數據集處理 以花卉識別項目為例&#xff0c;我們分別做出圖片的訓練集和測試集&#xff0c;訓練集的標…

Blender模型導入虛幻引擎設置

單位系統不一致 Blender默認單位是米&#xff08;Meters&#xff09;&#xff0c;而虛幻引擎默認使用**厘米&#xff08;Centimeters&#xff09;**作為單位。 當模型從Blender導出為FBX或其他格式時&#xff0c;如果沒有調整單位&#xff0c;虛幻引擎會將1米&#xff08;Blen…

Docker基礎詳解

Docker 技術詳解 一、概述 Docker官網&#xff1a;https://docs.docker.com/ 菜鳥教程&#xff1a;https://www.runoob.com/docker/docker-tutorial.html 1.1 什么是Docker&#xff1f; Docker 是一個開源的容器化平臺&#xff0c;它允許開發者將應用程序和其依賴項打包到…

FastPillars:一種易于部署的基于支柱的 3D 探測器

FastPillars&#xff1a;一種易于部署的基于支柱的 3D 探測器Report issue for preceding element Sifan Zhou 1 , Zhi Tian 2 , Xiangxiang Chu 2 , Xinyu Zhang 2 , Bo Zhang 2 , Xiaobo Lu11{}^{1}start_FLOATSUPERSCRIPT 1 end_FLOATSUPERSCRIPT11footnotemark: 1 Chengji…

NLP語言模型訓練里的特殊向量

1. CLS 向量和 DEC 向量的區別及訓練方式 (1) CLS 向量與 DEC 向量是否都是特殊 token&#xff1f; CLS 向量&#xff08;[CLS] token&#xff09;和 DEC 向量&#xff08;Decoder Input token&#xff09;都是特殊的 token&#xff0c;但它們出現在不同類型的 NLP 模型中&am…

字節跳動 UI-TARS 匯總整理報告

1. 摘要 UI-TARS 是字節跳動開發的一種原生圖形用戶界面&#xff08;GUI&#xff09;代理模型 。它將感知、行動、推理和記憶整合到一個統一的視覺語言模型&#xff08;VLM&#xff09;中 。UI-TARS 旨在跨桌面、移動和 Web 平臺實現與 GUI 的無縫交互 。實驗結果表明&#xf…

基于Python深度學習的鯊魚識別分類系統

摘要&#xff1a;鯊魚是海洋環境健康的指標&#xff0c;但受到過度捕撈和數據缺乏的挑戰。傳統的觀察方法成本高昂且難以收集數據&#xff0c;特別是對于具有較大活動范圍的物種。論文討論了如何利用基于媒體的遠程監測方法&#xff0c;結合機器學習和自動化技術&#xff0c;來…

【漫話機器學習系列】168.最大最小值縮放(Min-Max Scaling)

在機器學習和數據預處理中&#xff0c;特征縮放&#xff08;Feature Scaling&#xff09; 是一個至關重要的步驟&#xff0c;它可以使模型更穩定&#xff0c;提高訓練速度&#xff0c;并優化收斂效果。最大最小值縮放&#xff08;Min-Max Scaling&#xff09; 是其中最常見的方…

開源測試用例管理平臺

不可錯過的10個開源測試用例管理平臺&#xff1a; PingCode、TestLink、Kiwi TCMS、Squash TM、FitNesse、Tuleap、Robot Framework、SpecFlow、TestMaster、Nitrate。 開源測試用例管理工具提供了一種透明、靈活的解決方案&#xff0c;使團隊能夠在不受限的情況下適應具體的測…

鴻蒙闊折疊Pura X外屏開發適配

首先看下鴻蒙中斷點分類 內外屏開合規則 Pura X開合連續規則: 外屏切換到內屏,界面可以直接接續。內屏(鎖屏或非鎖屏狀態)切換到外屏,默認都顯示為鎖屏的亮屏狀態。用戶解鎖后:對于應用已適配外屏的情況下,應用界面可以接續到外屏。折疊外屏顯示展開內屏顯示折疊狀態…