SseEmitter'
时间: 2025-02-06 17:06:11 浏览: 41
### SseEmitter 使用方法及实例
#### 创建 SseEmitter 并管理连接
为了有效地管理和维护多个客户端的连接,可以创建一个 `SseEmitter` 容器作为单例 Bean 交给 Spring 管理。这通常是一个 `Map<String, SseEmitter>` 结构用于保存每个用户的 `SseEmitter` 实例。
```java
@Component
public class SseEmitterBean {
/**
* 存储特定客户端的 SseEmitter 对象
*/
@Bean(name = "sseEmitters")
public Map<String, OpenApiSseEmitter> sseEmitters() {
return new ConcurrentHashMap<>();
}
}
```
此配置允许应用程序轻松访问并操作各个会话中的 `SseEmitter` 对象[^2]。
#### 发送事件给客户端
当需要向已建立连接的客户端发送消息时,可以通过构建更复杂的事件结构来增强功能性和可读性:
```java
// 构建带有额外信息的数据包
SseEventBuilder eventBuilder = SseEmitter.event();
emitter.send(
eventBuilder.data(dataSet)
.name("dataSet-created")
.id(String.valueOf(dataSet.hashCode()))
);
```
上述代码片段展示了如何利用 `SseEventBuilder` 来设置自定义字段如 ID 和名称,从而使得接收到的消息更加有意义和易于解析[^3]。
#### 长时间任务监控的应用场景
对于一些可能持续较长时间的操作(例如文件上传状态更新),可以直接使用 `SseEmitter` 不断地将最新的进展反馈至前端页面上显示出来。这种方式特别适用于那些希望保持低延迟响应的同时又不想占用过多资源的情况。
```java
@GetMapping("/progress/{taskId}")
public void getProgress(@PathVariable String taskId, HttpServletResponse response) throws IOException {
SseEmitter emitter = new SseEmitter();
// 将新的发射器加入到全局映射表中以便后续查找
sseEmitters.put(taskId, (OpenApiSseEmitter) emitter);
try {
while (!taskIsFinished()) {
Thread.sleep(1000); // 模拟等待一段时间
// 向浏览器推送最新进度百分比
emitter.send(SseEmitter.event().data(getCurrentPercentage()));
}
// 清除已完成的任务记录
sseEmitters.remove(taskId);
// 关闭流以结束通信
emitter.complete();
} catch (Exception e) {
emitter.completeWithError(e);
}
}
```
这段示例说明了怎样在一个 GET 请求处理器内部启动一个新的 SSE 连接,并周期性地检查某个后台作业的状态变化,一旦有新情况就立即通知远端用户界面进行刷新展示[^4]。
阅读全文
相关推荐


















