sse无法主动下发维护通知,但可通过服务端返回503或维护事件、前端监听状态码与id、健康检查、本地缓存及多标签页协同实现平滑维护提示。

SSE 本身不支持“主动下发维护通知”这种跨连接生命周期的操作,但可以通过服务端配合、前端状态管理与兜底策略,在服务器升级或重启期间,让客户端及时感知并展示维护提示。关键不是靠 SSE 连接本身“扛过重启”,而是利用其重连机制 + 服务端响应控制 + 前端智能判断,实现平滑过渡和用户可见的维护提醒。
服务端返回维护状态码或特殊事件
当服务器准备升级或进入维护模式时,不要直接断开所有 SSE 连接,而是让 SSE 接口统一返回可识别的响应:
- 返回 HTTP 503 Service Unavailable 状态码,并在响应体中写入标准 SSE 格式消息(如 event: maintenance
data: {"message":"系统即将升级,请稍候..."}
id: maintenance-20260820
\n\n),确保客户端能收到最后一条明确事件 - 或保持 200 状态,但只推送维护事件(event: maintenance),不再发送业务数据;同时设置 retry: 30000(30秒重试),避免高频无效重连
- 配合 Nginx 等反向代理,在维护期直接将 /api/stream 路由到一个静态维护响应服务,统一输出维护事件流
前端监听 error + 状态码,触发维护 UI
客户端不能只依赖 onerror,因为连接断开可能是网络问题,也可能是服务端主动关闭。需结合响应状态判断:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 在 EventSource.onerror 中检查 eventSource.readyState:若为 0(CLOSED) 且已尝试重连多次(如超过 3 次),再结合时间窗口(如 10 秒内连续失败),视为“疑似维护”
- 更可靠的方式:服务端在返回维护事件时,附带 id: maintenance-xxx;前端收到该 id 后,清空重连计数、停止自动重连,并立即显示维护弹窗
- 用 fetch('/api/health') 或轻量心跳接口做辅助探测:当 SSE 断连后,主动请求健康检查接口,若返回 503 或 {"status":"maintenance"},则确认维护状态
客户端本地缓存与降级提示
用户可能在维护开始后才打开页面,此时 SSE 还未建立连接。需提前埋点:
- 首页加载时,同步请求一次 /api/maintenance-flag(返回 {active: true, message: "...", scheduledUntil: "2026-08-20T14:30:00Z"}),有则直接显示横幅
- 将维护状态存入 localStorage,并设置过期时间(如 10 分钟),避免重复请求;SSE 恢复后清除该标记
- 若检测到维护中,禁用相关操作按钮,替换页面核心区域为静态维护页(含预计恢复时间、联系方式等)
多标签页协同避免重复提示
用户可能开多个标签页,需防止每个页都弹出维护通知:
- 使用 localStorage + storage 事件广播:首个标签页触发维护 UI 时,写入 __maintenance_active;其他标签页监听 storage 事件,检测到该 key 变化后同步 UI
- 借助 BroadcastChannel API (兼容性较好,Chrome 66+、Firefox 66+、Edge 79+)发送 "maintenance-start" 消息,各标签页接收后统一响应
- 维护结束时,服务端恢复 SSE 正常流,并推送 event: maintenance-end,前端收到后清除本地标记、恢复功能
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










