教育人就是要培养他对自己有更严格的要求。——苏霍姆林斯基
SseEmitter
是 Spring Framework 提供的一个类,用于处理服务器向客户端推送事件(Server-Sent Events, SSE)的功能。与 WebSocket 不同,SSE 是单向的,服务器可以推送数据到客户端,但客户端不能推送数据到服务器。SSE 适用于场景包括实时消息通知、进度更新、数据流推送等。Spring Boot 中通过 SseEmitter
实现 SSE 通信简单且高效。
Spring Boot 中的 SseEmitter
提供了一种轻量级的方式来向前端推送实时数据,它通过标准的 HTTP 协议工作,兼容性广泛且易于使用。
SseEmitter 的主要特点:
官方文档提供了 SseEmitter
的详细使用方法,而 GitHub 仓库中有关于 Spring Boot 及其 SSE 实现的代码示例。
使用 Spring Boot 时,SseEmitter
是框架自带的类,通常不需要额外的依赖。但如果需要增强对 SSE 的支持,建议引入 spring-boot-starter-web
:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
下面是一个使用 SseEmitter
实现服务器推送的简单示例,演示如何向客户端推送实时更新消息。
示例:实时消息推送
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
import java.io.IOException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
@RestController
public class SseController {
// 使用线程池处理异步任务
private final ExecutorService executor = Executors.newCachedThreadPool();
@GetMapping("/sse")
public SseEmitter handleSse() {
SseEmitter emitter = new SseEmitter(60_000L); // 设置超时时间为60秒
executor.submit(() -> {
try {
for (int i = 0; i < 5; i++) {
TimeUnit.SECONDS.sleep(1); // 模拟延迟
emitter.send("实时消息更新 " + i); // 发送消息
}
emitter.complete(); // 完成推送
} catch (IOException | InterruptedException e) {
emitter.completeWithError(e); // 处理异常
}
});
return emitter;
}
}
代码解析:
/sse
路由下创建一个 SseEmitter
对象,设置超时时间为 60 秒,表示连接将在 60 秒内保持活跃。emitter.send()
方法将消息发送到客户端。emitter.complete()
关闭连接。如果推送过程中发生异常,可以通过 emitter.completeWithError()
进行错误处理。客户端可以使用以下 JavaScript 代码接收推送的实时消息:
const eventSource = new EventSource("/sse");
eventSource.onmessage = function(event) {
console.log("收到消息: ", event.data);
};
eventSource.onerror = function() {
console.error("连接出错或已关闭");
};
应用场景:
总结
SseEmitter
提供了一种轻量、直观的方式实现服务器推送操作,尤其适用于需要向客户端发送实时数据的场景。它的实现基于标准的 HTTP 协议,简单易用,同时可以通过长连接减少服务器与客户端之间的轮询压力。
在使用 SseEmitter
时,开发者可以通过异步处理机制提升应用的响应速度,确保高效的实时推送体验。如果你的项目中有实时推送需求,SseEmitter
是一个非常合适的解决方案。