厦门建站服务,网站建设实施计划,网站模板文件不存在,推广网站设计推广方案#x1f31f; 前言 欢迎来到我的技术小宇宙#xff01;#x1f30c; 这里不仅是我记录技术点滴的后花园#xff0c;也是我分享学习心得和项目经验的乐园。#x1f4da; 无论你是技术小白还是资深大牛#xff0c;这里总有一些内容能触动你的好奇心。#x1f50d; #x… 前言 欢迎来到我的技术小宇宙 这里不仅是我记录技术点滴的后花园也是我分享学习心得和项目经验的乐园。 无论你是技术小白还是资深大牛这里总有一些内容能触动你的好奇心。 洛可可白个人主页 个人专栏✅前端技术 ✅后端技术 个人博客洛可可白博客 代码获取bestwishes0203 封面壁纸洛可可白wallpaper SpringBoot中SSE接口的两种方法 实现实时数据推送SpringBoot中SSE接口的两种方法一、什么是SSE二、项目环境准备1. 基础依赖 三、两种实现方式对比四、传统Servlet实现基于SseEmitter1. 控制器实现2. 关键点解析 五、响应式实现基于WebFlux1. 控制器实现2. 核心优势 六、接口测试方法1. 使用curl测试2. 前端示例 七、生产环境注意事项八、扩展应用场景九、总结 实现实时数据推送SpringBoot中SSE接口的两种方法
一、什么是SSE
SSEServer-Sent Events 是一种基于HTTP的服务器向客户端单向实时推送数据的技术。与WebSocket不同SSE天然支持断线重连且协议简单适用于股票行情、实时日志、消息通知等场景。 二、项目环境准备
1. 基础依赖
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId
/dependency!-- 若使用WebFlux方式 --
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-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 FluxServerSentEventString streamEvents() {return Flux.interval(Duration.ofSeconds(1)).map(sequence - ServerSentEvent.Stringbuilder().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-stream2. 前端示例
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
如果对你有帮助点赞、收藏、关注是我更新的动力