IM WebSocket
这篇解决什么
在线通知怎么推、消息 type 是什么。读完能对上 ImNotificationWebSocketDTO.TYPE = "im-notification",以及推送走基础设施 /infra/ws,不是 IM 自己再开一条端口。
默认端口 48080。先完成 IM 功能设计。离线补齐靠 私聊、群聊、频道消息 的 pull。框架握手见 WebSocket。
示意图:业务只组通知外壳。真正发帧的是框架 Sender。事务提交后再异步推。
从哪改
| 名称 | 说明 | 仓库路径 |
|---|---|---|
| IM 推送 | sendNotificationAsync / broadcastNotificationAsync | ruoyi-office/yudao-module-im/.../websocket/ImWebSocketServiceImpl.java |
| 外壳 | type=im-notification | ImNotificationWebSocketDTO |
| 框架 | WebSocketSenderApi.sendObject | yudao-module-infra-api |
| 握手 | 连接带 ?token= | LoginUserHandshakeInterceptor |
| 路径 | yudao.websocket.path | ruoyi-office/yudao-server/src/main/resources/application.yaml |
单体默认 yudao.websocket.enable=true,path=/infra/ws,sender-type=local。多实例再改 redis / rocketmq / kafka / rabbitmq。
推送目标用户类型固定 UserTypeEnum.ADMIN。外壳字段:conversationType、contentType、payload。进聊天流的用 1/2/3;好友申请、加群审批、通话振铃用会话类型 0(无会话)。
persistent=false 的类型只推在线,离线靠各自 pull / 专用存储。READ 游标不靠这张 WebSocket 当权威。
调用方若在事务里,推送挂到 afterCommit,再 @Async 发出,避免客户端先于库可见。
前端:PC views/im/home、UniApp pages-im 都订阅同一 type。没有 IM 专用 WebSocket Controller。
字段
| 名称 | 说明 | 仓库路径 |
|---|---|---|
TYPE | 固定 im-notification | ImNotificationWebSocketDTO |
conversationType | 0 无会话 / 1 私聊 / 2 群 / 3 频道 | 同上 |
contentType | ImContentTypeEnum 数字 | 同上 |
payload | 对应通知对象 | 同上 |
path | 默认 /infra/ws | application.yaml |
不是 LiveKit 那条 ws
媒体进 yudao.im.rtc.livekit-url(默认 7880)。本篇是业务通知。两条连错,会话能聊、电话没声,或反过来。
频道全员推走广播
receiverUserIds 空时频道推送走 broadcastNotificationAsync。私聊是点对点 sendObject(userId)。
示意图:按本仓库实现画的时序。
配置与操作
IM 没有单独的 WebSocket 菜单。YAML 改 yudao.websocket:enable 默认 true,path=/infra/ws,sender-type=local(多实例再改 redis / rocketmq / kafka / rabbitmq)。握手是 ws://127.0.0.1:48080/infra/ws?token=,不走 /admin-api。
保存后 IM 只组 ImNotificationWebSocketDTO(type=im-notification),真正发帧的是 WebSocketSenderApi。目标用户类型固定 ADMIN。进聊天流的会话类型是 1/2/3;好友申请、加群审批、通话振铃用 0。频道全员推 receiverUserIds 空时走 broadcastNotificationAsync。事务提交后再 @Async 推。在线会话台账在 基础设施 → WebSocket(2525,/infra/websocket)。用户页 /im/home。媒体是 LiveKit 7880,不要连错。开启见 IM 功能设计。

本系统截图:完整 IM 会话页 /im/home。长连接订阅 im-notification。

本系统截图:基础设施 → WebSocket。这里看的是框架握手,不是 LiveKit。
