-
长轮询 :服务器在有数据时会立即响应客户端请求,若暂无数据,则保持连接开放,等待数据到来。
-
服务器推送事件 (SSE) :服务器能够持续不断地向客户端推送各类事件,实现实时交互。
-
流式传输 :可逐步发送大量数据,像文件下载或者实时数据流传输等场景都适用。
-
异步处理 :在处理耗时任务时,能逐步返回处理结果,避免客户端长时间等待,提升用户体验。
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(){
// 模拟从日志文件中获取最新日志条目
return"2025-02-12 12:00:00 - INFO: User logged in successfully.";
}
}![]()
![]()
-
send(Object data) :向客户端发送数据,该方法可以多次调用,实现数据的逐步发送。
-
complete() :用于结束响应流,表示数据已经全部发送完毕。
-
onTimeout(Runnable callback) :设置超时回调函数,当连接超时时,会执行该回调。
-
onCompletion(Runnable callback) :设置完成回调函数,当数据发送完成后,会执行该回调。
-
客户端支持 :虽然大多数浏览器和 HTTP 客户端库都支持分块传输,但某些老旧的客户端可能存在兼容性问题。
-
超时设置 :为避免长连接长时间占用资源,可以为 ResponseBodyEmitter 设置超时时间,示例代码如下:
emitter.onTimeout(() -> emitter.complete());
-
线程安全 : ResponseBodyEmitter 的 send() 方法是线程安全的,但在使用时需要注意控制任务线程的生命周期,避免出现资源泄漏。
-
连接关闭 :务必确保在任务结束时调用 complete() 或 completeWithError() 方法,否则可能导致连接无法正常关闭,造成资源浪费。
-
Streaming :直接通过 OutputStream 向客户端写入数据,灵活性较高,但需要手动处理流的关闭,增加了开发的复杂度。
-
Server-Sent Events (SSE) :基于 text/event-stream 协议,适用于服务端事件推送场景,但要求客户端支持 SSE 协议。
-
ResponseBodyEmitter :通用性更强,适用于任何支持 HTTP 的客户端,并且易于与 Spring 框架集成,是一种更为便捷的流式传输解决方案。
往期推荐
Spring 项目别再乱注入 Service 了!用 Lambda 封装个统一调用组件,爽到飞起
Spring Boot 3 + Netty 构建高并发即时通讯服务
告别“API难民”!GLM Coding Plan让我每月省下2000元,编码效率不降反升。。。
SpringBoot架构实战:拦截器+全局异常+日志追踪一体化解决方案
IDEA深度用户必备:高效部署技巧,一键搞定项目发布
SpringBoot + nmap4j 获取端口信息

