什么是 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; }
|
访问效果
注意事项
- 接口中直接返回
SseEmitter
对象,推送事件需要在异步线程中执行。
- 若使用 Nginx 代理接口,需要配置
proxy_buffering off;
关闭代理的缓冲流,使得后端推送的数据可以实时刷新。
- SSE 是 HTTP 长连接,需要在连接超时之前推送信息,若无有效推送,可以设置一个标记字符作为维持连接的心跳支持。