# rdms-spring-boot-starter-websocket ## 1. 模块定位 `rdms-spring-boot-starter-websocket` 是 WebSocket 基础设施模块,用于统一处理连接、会话管理、消息分发与消息发送。 模块聚合的核心能力: - WebSocket 自动装配与路径注册 - 登录用户绑定与会话管理 - JSON 消息协议与监听器分发 - 消息发送 ## 2. 设计思路 - 统一 JSON 消息协议(`type` + `content`),通过 `type` 分发到对应监听器,降低业务耦合。 - 通过 `WebSocketSessionManager` 统一管理会话,支持按用户类型/用户编号/会话 ID 进行推送。 - 通过本地发送器支持单机消息推送。 - 与安全体系结合,在握手阶段写入 `LoginUser`,便于后续鉴权与定向发送。 ## 3. 功能模块 ### 3.1 自动装配 `RdmsWebSocketAutoConfiguration` 会完成: - 注册 WebSocket 路径与处理器 - 注册握手拦截器(默认 `LoginUserHandshakeInterceptor`) - 注册 `WebSocketSessionManager` - 放行 WebSocket 路径的安全校验 - 注册消息发送器 ### 3.2 JSON 消息协议 内置统一消息结构: ```json { "type": "notice", "content": "{...}" } ``` 处理流程: - `JsonWebSocketMessageHandler` 解析 JSON - 根据 `type` 选择对应 `WebSocketMessageListener` - 将 `content` 反序列化为监听器泛型类型并交给业务处理 内置 `ping/pong`:收到 `ping` 会直接返回 `pong`。 ### 3.3 会话管理 `WebSocketSessionManager` 支持: - 按 `sessionId` 获取会话 - 按 `userType` 获取会话列表 - 按 `userType + userId` 获取会话列表 用于定向推送和广播推送。 ### 3.4 消息发送 统一使用 `WebSocketMessageSender` 发送消息: - 按用户推送 - 按用户类型广播 - 按会话 ID 推送 消息会被封装为统一的 `JsonWebSocketMessage` 后发送。 ### 3.5 登录用户绑定 握手阶段会读取当前登录用户并写入 WebSocket Session: - 需要前端通过 `?token={token}` 形式携带令牌 - `LoginUserHandshakeInterceptor` 会将 `LoginUser` 写入 Session - `WebSocketFrameworkUtils` 可获取 `userId/userType/tenantId` ## 4. 开发人员上手 ### 4.1 引入依赖 ```xml com.njcn rdms-spring-boot-starter-websocket ``` ### 4.2 基础配置 ```yaml rdms: websocket: enable: true path: /ws ``` 说明: - `path` 默认 `/ws` - `enable` 默认 `true` ### 4.3 连接方式 前端连接示例: ``` ws://{host}:{port}/ws?token={token} ``` ### 4.4 编写消息监听器 ```java @Component public class NoticeMessageListener implements WebSocketMessageListener { @Override public void onMessage(WebSocketSession session, NoticeDTO message) { // 处理消息 } @Override public String getType() { return "notice"; } } ``` ### 4.5 服务端推送 ```java @Resource private WebSocketMessageSender webSocketMessageSender; public void push(Long userId, NoticeDTO notice) { webSocketMessageSender.sendObject(UserTypeEnum.ADMIN.getValue(), userId, "notice", notice); } ```