🌟 前言
欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍
🤖 洛可可白:个人主页
🔥 个人专栏:✅前端技术 ✅后端技术
🏠 个人博客:洛可可白博客
🐱 代码获取: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>
七、生产环境注意事项
-
连接管理:设置合理的超时时间(默认30秒)
-
错误处理:添加onError回调记录异常
-
跨域配置:需要配置CORS
@Configuration public class WebConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/sse*").allowedOrigins("*");} }
-
性能监控:跟踪活跃连接数
八、扩展应用场景
- 实时股票报价推送
- 系统运行状态监控
- 聊天应用消息通知
- 长耗时任务进度更新
九、总结
两种实现方式各有优势:
- 传统Servlet方式 适合简单场景,快速实现
- WebFlux方式 更适合高并发、低延迟需求
建议根据实际场景选择,对于新项目推荐使用WebFlux实现,能更好地利用系统资源。希望本文能帮助您快速上手SpringBoot中的SSE开发!
源码地址:https://gitee.com/bestwishes0203
如果对你有帮助,点赞👍、收藏💖、关注🔔是我更新的动力!👋🌟🚀