实现实时数据推送: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.mzph.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开合连续规则: 外屏切换到内屏,界面可以直接接续。内屏(锁屏或非锁屏状态)切换到外屏,默认都显示为锁屏的亮屏状态。用户解锁后:对于应用已适配外屏的情况下,应用界面可以接续到外屏。折叠外屏显示展开内屏显示折叠状态…