建设工程考试官方网站,合肥建设干部学校网站首页,网站收费模板,网站开发的方式目前市面上异步推送大多用的是websocket或者http轮训#xff0c;今天咱们换一种更为简便的方式来实现流式输出#xff0c;那就是 ResponseBodyEmitter。 其实#xff0c;ResponseBodyEmitter 并非新技术#xff0c;早在 Spring Framework 4.2 版本就已被引入。直到最近 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都能帮助我们构建更加动态和互动的应用程序。