SSE实时推送订单状态
SSE
SSE是一种基于HTTP长连接的单向通信技术,只能从服务器到客户端。
特点: 自动重连机制,比Websocket轻量,传输格式text。
后端
创建SSEConntroller,需要时GET方法,与前端进行连接
SseEmitter 是 Spring 封装的 SSE 实现,底层遵循 SSE 协议规范
后端创建SseEmitterService,并封装sendMessage方法,订单变化时调用相应方法。
emitter
.send(SseEmitter.event()
.id(String.valueOf(System.currentTimeMillis()))
.name(eventName)
.data(data));// SSE格式数据携带消息ID、事件名称和消息
前端
前端需要创建一个SSE全局上下文,包括根节点。
在SSE全局上下文中创建JS原生API EventSource,创建自定义事件监听器对应上面的eventName事件,eventSource.addEventListener(eventName, ...)收取消息。
EventSource
EventSource使用JS的一个原生API,用来订阅SSE流。
只能使用GET请求,且不能携带header,如果为了通过token校验,可以在URL添加参数token。
每次请求浏览器就会记录消息ID,重连时,自动在请求头中添加lastEventId,可以通过这个解决断线时消息未提醒问题
使用场景
- 实时数据更新
- 消息提醒、内容推送
- 状态、进度提醒
