SpringBoot + ResponseBodyEmitter 实时异步流式推送
目前市面上异步推送大多用的是websocket或者http轮训今天咱们换一种更为简便的方式来实现流式输出那就是ResponseBodyEmitter。其实ResponseBodyEmitter并非新技术早在 Spring Framework 4.2 版本就已被引入。直到最近我们在开发一个滚动日志输出功能时才深入了解到它的强大之处。ResponseBodyEmitter 的作用相较于 websocket 技术ResponseBodyEmitter更加简单易用。它主要用于处理异步的 HTTP 响应其核心优势在于允许逐步将数据发送到客户端而非一次性发送所有内容。这一特性使得它在需要长时间处理或进行流式传输的场景中表现出色。需要注意的是ResponseBodyEmitter本质上是一个接口。使用场景长轮询服务器在有数据时会立即响应客户端请求若暂无数据则保持连接开放等待数据到来。服务器推送事件 (SSE)服务器能够持续不断地向客户端推送各类事件实现实时交互。流式传输可逐步发送大量数据像文件下载或者实时数据流传输等场景都适用。异步处理在处理耗时任务时能逐步返回处理结果避免客户端长时间等待提升用户体验。业务场景举例在实际业务中ResponseBodyEmitter有着广泛的应用比如进度条的实时更新、实时聊天功能、股票价格的实时更新、系统日志的流式输出以及 AI 的流式响应等。实时日志流实战接下来我们通过一个简单的实时日志流功能来深入了解ResponseBodyEmitter的使用。假设我们有一个应用程序需要实时查看服务器的日志以便快速定位和解决问题。创建控制器首先我们在 Spring Boot 应用中创建一个控制器借助ResponseBodyEmitter实现实时日志流。import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter; RestController RequestMapping(/api/log) publicclass LogController { GetMapping(value /stream, produces MediaType.TEXT_EVENT_STREAM_VALUE) public ResponseBodyEmitter streamLogs() { ResponseBodyEmitter emitter new ResponseBodyEmitter(); // 开启异步线程处理数据并发送 new Thread(() - { try { while (true) { String logEntry getLatestLogEntry(); if (logEntry ! null) { emitter.send(logEntry); } // 每秒检查一次日志更新 Thread.sleep(1000); } } catch (Exception e) { // 出现异常时结束响应并传递错误信息 emitter.completeWithError(e); } }).start(); return emitter; } private String getLatestLogEntry() { // 模拟从日志文件中获取最新日志条目 return2025-02-12 12:00:00 - INFO: User logged in successfully.; } }运行效果当我们启动这个应用程序并访问/api/log/stream路径时就能看到一个实时更新的日志流。服务器会每秒向客户端推送一条新的日志条目客户端会将其显示在页面上效果如下ResponseBodyEmitter 的核心方法send(Object data)向客户端发送数据该方法可以多次调用实现数据的逐步发送。complete()用于结束响应流表示数据已经全部发送完毕。onTimeout(Runnable callback)设置超时回调函数当连接超时时会执行该回调。onCompletion(Runnable callback)设置完成回调函数当数据发送完成后会执行该回调。ResponseBodyEmitter 工作原理异步数据生成与推送在传统的 HTTP 请求 - 响应模式中服务器通常需要等待整个响应数据生成完成后才会将其一次性发送给客户端。而ResponseBodyEmitter打破了这种模式它允许服务端在任务执行过程中异步地生成响应数据。当有部分数据准备好时就可以立即调用send()方法将这些数据推送给客户端而无需等待整个任务完成。这就好比一场接力赛每完成一段赛程生成一部分数据就马上将接力棒数据传递给客户端大大提高了数据传输的实时性。分块传输机制ResponseBodyEmitter采用了 HTTP 的分块编码Chunked Encoding方式来传输数据。在传统的 HTTP 响应中通常需要在响应头中明确指定Content-Length表示整个响应数据的长度。但在分块传输中服务器不会提前设置Content-Length而是将数据分成多个独立的块每个块都有自己的长度标识。客户端在接收到数据块后可以立即对其进行处理而不必等待整个响应数据接收完毕。这种方式使得数据可以边生成边传输减少了客户端的等待时间提高了用户体验。连接生命周期管理为了确保资源的合理使用ResponseBodyEmitter提供了对连接生命周期的有效管理。当所有数据都发送完毕后需要调用complete()方法来明确告知客户端响应结束关闭连接。如果在数据传输过程中出现异常可以调用completeWithError()方法结束响应并向客户端传递错误信息。这样可以避免连接长时间保持开放造成资源浪费。注意事项客户端支持虽然大多数浏览器和 HTTP 客户端库都支持分块传输但某些老旧的客户端可能存在兼容性问题。超时设置为避免长连接长时间占用资源可以为ResponseBodyEmitter设置超时时间示例代码如下emitter.onTimeout(() - emitter.complete());线程安全ResponseBodyEmitter的send()方法是线程安全的但在使用时需要注意控制任务线程的生命周期避免出现资源泄漏。连接关闭务必确保在任务结束时调用complete()或completeWithError()方法否则可能导致连接无法正常关闭造成资源浪费。小结ResponseBodyEmitter是 Spring 框架提供的轻量级流式传输解决方案它能够显著提升高并发和实时性场景下的用户体验。通过ResponseBodyEmitter我们可以轻松实现服务器向客户端的实时数据推送。无论是进度条的实时更新、实时聊天、股票价格的实时监控还是系统日志的流式输出ResponseBodyEmitter都能帮助我们构建更加动态和互动的应用程序。

相关新闻

Mysql小表驱动大表优化原理

Mysql小表驱动大表优化原理

MySQL 小表驱动大表优化原理详解 “小表驱动大表”是 MySQL 中 JOIN 优化时最核心、最常被提及的原则之一,很多面试和实际优化案例都会问到这个点。 下面从原理、执行过程、为什么重要、实际影响、常见误区几个维度给你讲清楚。 1. 核心原理:Nested L…

2026/7/2 21:44:40 阅读更多 →
学霸都在用!2026AI 论文生成软件榜单,科研党亲测好用

学霸都在用!2026AI 论文生成软件榜单,科研党亲测好用

在 2026 年的学术战场上,AI 论文工具已从 “辅助选项” 升级为 “科研标配”。本文精选 8 款实测无坑的 AI 论文神器,覆盖从选题到答辩的全流程,兼顾免费开源、全能付费、垂直领域三大场景,特别标注适合本科生 / 硕博 / 期刊作者的…

2026/5/17 3:39:34 阅读更多 →
Git Flow 详解与最佳实践:打造规范高效的团队协作流程

Git Flow 详解与最佳实践:打造规范高效的团队协作流程

在软件开发过程中,分支管理策略直接影响团队协作效率、代码质量和发布稳定性。而 Git Flow 正是其中一种经典且被广泛采用的 Git 分支模型。本文将深入讲解 Git Flow 的核心思想、分支角色、操作流程,并结合实际场景给出最佳实践建议,助你构建…

2026/5/17 3:39:33 阅读更多 →

最新新闻

软考与华为认证路径全拆解,从报名周期、考试难度到续证成本,一文看透隐藏成本!

软考与华为认证路径全拆解,从报名周期、考试难度到续证成本,一文看透隐藏成本!

更多请点击: https://intelliparadigm.com 第一章:软考与华为认证HCIP/HCIE区别 软考(全国计算机技术与软件专业技术资格(水平)考试)与华为认证(HCIP/HCIE)在定位、目标人群、知识体…

2026/7/3 8:42:27 阅读更多 →
软考高级/中级/初级证书继续教育学分要求全对比,3张表说清每年必修24学分背后的逻辑与替代方案

软考高级/中级/初级证书继续教育学分要求全对比,3张表说清每年必修24学分背后的逻辑与替代方案

更多请点击: https://intelliparadigm.com 第一章:软考证书继续教育学分制度的政策演进与核心定位 软考(计算机技术与软件专业技术资格(水平)考试)证书持有人的继续教育学分管理,是国家对信息技…

2026/7/3 8:42:27 阅读更多 →
OpenCode模型配置与切换:本地AI编程的可控性实践

OpenCode模型配置与切换:本地AI编程的可控性实践

1. 项目概述:这不是一个“装完就能用”的玩具,而是一把需要亲手校准的代码刻刀 OpenCode——这个名字在2024年中后期开始频繁出现在国内开发者社区的技术分享帖、内部工具链讨论组和AI辅助编程评测报告里。它不是GitHub Copilot的平替,也不是…

2026/7/3 8:40:27 阅读更多 →
5步彻底解决OFD文件兼容性问题:开源转换工具实战指南

5步彻底解决OFD文件兼容性问题:开源转换工具实战指南

5步彻底解决OFD文件兼容性问题:开源转换工具实战指南 【免费下载链接】Ofd2Pdf Convert OFD files to PDF files. 项目地址: https://gitcode.com/gh_mirrors/ofd/Ofd2Pdf 你是否曾经因为收到OFD格式的电子发票而无法在手机上查看?是否因为政府发…

2026/7/3 8:38:26 阅读更多 →
AI知识库投喂:企业智能化的关键一步

AI知识库投喂:企业智能化的关键一步

于企业智能化转型的浪潮里面, AI知识库已然变成提升工作效率以及决策质量的核心工具。可是呢, 好多企业在部署AI知识库之际, 常常忽视了“投喂”这个关键环节。所说的“投喂”, 是把企业内部的结构化还有非结构化数据, 像项目文档、会议纪要、客户资料、技术手册等, 有系统地输…

2026/7/3 8:38:26 阅读更多 →
HsMod终极指南:55个功能全面解锁您的炉石传说游戏体验

HsMod终极指南:55个功能全面解锁您的炉石传说游戏体验

HsMod终极指南:55个功能全面解锁您的炉石传说游戏体验 【免费下载链接】HsMod Hearthstone Modification Based on BepInEx 项目地址: https://gitcode.com/GitHub_Trending/hs/HsMod HsMod是基于BepInEx框架开发的炉石传说增强插件,为您提供了55…

2026/7/3 8:36:25 阅读更多 →

日新闻

Nginx防御TLS重协商攻击实战:从原理到配置与监控

Nginx防御TLS重协商攻击实战:从原理到配置与监控

1. 项目概述:为什么TLS重协商攻击至今仍需警惕十多年前的CVE-2011-1473,一个关于TLS/SSL协议重协商机制的漏洞,现在提起来还有必要吗?很多运维和开发朋友可能会觉得,这都老掉牙了,现代服务器和客户端不都默…

2026/7/3 0:03:59 阅读更多 →
华为防火墙双通道远程管理实战:Web与SSH配置详解

华为防火墙双通道远程管理实战:Web与SSH配置详解

1. 项目概述:为什么需要双通道远程管理防火墙?在任何一个稍具规模的企业网络里,防火墙都是那个默默守护在边界的关键角色。作为网络工程师,我们不可能每次都跑到机房,插上console线去配置它。远程管理能力,…

2026/7/3 0:03:59 阅读更多 →
AD74413R与PIC18F65K40的高精度工业数据采集方案

AD74413R与PIC18F65K40的高精度工业数据采集方案

1. 项目概述:AD74413R与PIC18F65K40的协同工作在工业自动化和精密测量领域,同时实现高精度模数转换(ADC)和数模转换(DAC)功能是许多复杂系统的核心需求。AD74413R作为一款四通道可配置模拟输入/输出器件,与PIC18F65K40微控制器的组合&#xf…

2026/7/3 0:05:59 阅读更多 →

周新闻

月新闻