websocket断线时消息可存indexeddb待重连后补发,需维护isconnected状态、设计含id/data/timestamp/status的表结构、onopen时按timestamp升序重发pending消息并更新状态,辅以重试上限与用户提示。

WebSocket断线时新发的消息可以先存进IndexedDB,等重连成功后再批量补发。关键在于消息队列管理、离线状态识别、存储结构设计和重发时机控制。
监听连接状态并维护离线标记
WebSocket本身没有内置的“是否离线”属性,需手动维护连接状态。建议在实例上挂载一个 isConnected 标记,并在 onopen、onclose、onerror 中同步更新:
-
onopen → 设为
true,并触发一次待发队列检查 -
onclose 和 onerror → 设为
false,后续发送直接走缓存流程 - 避免仅依赖
ws.readyState === WebSocket.OPEN,因为关闭瞬间可能仍为OPEN,实际已不可用
发送前判断并写入IndexedDB队列
封装统一的发送函数,每次调用前检查连接状态。若离线,则把消息(含时间戳、唯一ID、原始数据)序列化后存入IndexedDB:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 表结构建议包含字段:
id(自增或UUID)、data(JSON字符串)、timestamp(Date.now())、status('pending' / 'sent' / 'failed') - 使用
indexedDB.open()打开库,事务设为"readwrite",确保写入可靠 - 可对
data字段建立二进制或文本索引(如用createIndex("byTimestamp", "timestamp")),便于按序重发
重连成功后自动补发未完成消息
在 onopen 回调中启动补发逻辑,但要防重复触发(比如多次重连):
- 加一个 isReplaying 锁,防止并发执行
- 用游标遍历
status === 'pending'的记录,按timestamp升序逐条发送 - 每条发送成功后,在 IndexedDB 中更新其
status为'sent';失败则保留为'pending',下次重试 - 建议加简单重试上限(如最多3次),避免死循环卡住队列
用户感知与体验优化
纯后台缓存不够友好,需配合前端反馈:
- 发送按钮可显示“发送中…”或“离线缓存中”,状态来自 isConnected
- 补发完成后,用
Notification或轻提示告知“已补发 X 条消息” - 允许用户手动清空失败队列(比如长期离线后放弃补发),提供清除接口
- 敏感操作(如支付确认)不建议完全依赖此机制,应同步服务端幂等校验
不复杂但容易忽略细节,比如事务失败没捕获、补发时没做节流、消息体过大导致 IndexedDB 写入失败等。实际落地时建议搭配简单的日志记录(如 console.warn + 时间戳),方便排查缓存异常。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










