什么是 SSE

SSE 全程 server-sent event,即服务端推送事件,是服务端到客户端的单向半双工通信技术,适用于服务器向客户端推送实时信息,但是传输量小,且只支持 UTF-8 的编码 key-value 格式的文本数据流,不能传输二进制流。

代码实现

使用 Spring 提供的  SseEmitter  封装类,每隔 2s 向客户端推送一次数据,共推送 5 次。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@GetMapping("/emitter")
public SseEmitter sseEmitter() {
SseEmitter sseEmitter = new SseEmitter(0L);
taskExecutor.execute(() -> {
for (int i = 1; i < 6; i++) {
try {
sseEmitter.send("第" + i + "次发送");
log.info("第 {} 次发送", i);
Thread.sleep(1000 * 2);
} catch (IOException | InterruptedException e) {
log.error("发生异常了: {}", e.getMessage());
sseEmitter.completeWithError(e);
}
}
sseEmitter.complete();
});
return sseEmitter;
}

访问效果

sse-emitter.gif

注意事项

  1. 接口中直接返回  SseEmitter 对象,推送事件需要在异步线程中执行。
  2. 若使用 Nginx 代理接口,需要配置  proxy_buffering off;  关闭代理的缓冲流,使得后端推送的数据可以实时刷新。
  3. SSE 是 HTTP 长连接,需要在连接超时之前推送信息,若无有效推送,可以设置一个标记字符作为维持连接的心跳支持。

评论