600 lines
15 KiB
Markdown
600 lines
15 KiB
Markdown
|
|
# WebSocket增强功能验证清单
|
|||
|
|
|
|||
|
|
## 📋 代码完整性验证
|
|||
|
|
|
|||
|
|
### ✅ 所有文件已创建
|
|||
|
|
|
|||
|
|
#### 核心服务类(8个)
|
|||
|
|
- [x] `OnlineStatusService.java` - 在线状态服务接口
|
|||
|
|
- [x] `OnlineStatusServiceImpl.java` - 在线状态服务实现
|
|||
|
|
- [x] `OfflineMessageService.java` - 离线消息服务接口
|
|||
|
|
- [x] `OfflineMessageServiceImpl.java` - 离线消息服务实现
|
|||
|
|
- [x] `HeartbeatScheduler.java` - 心跳检测调度器
|
|||
|
|
- [x] `OnlineStatusController.java` - REST API控制器
|
|||
|
|
- [x] `OfflineMessageController.java` - 离线消息REST API控制器
|
|||
|
|
- [x] `OfflineMessageCleanupTask.java` - 离线消息清理定时任务
|
|||
|
|
|
|||
|
|
#### 修改的文件(4个)
|
|||
|
|
- [x] `LiveChatHandler.java` - 已集成新功能
|
|||
|
|
- [x] `PrivateChatHandler.java` - 已集成新功能
|
|||
|
|
- [x] `CrmebFrontApplication.java` - 已添加@EnableScheduling
|
|||
|
|
- [x] `RedisUtil.java` - 已添加List操作方法(lLeftPop, lRightPop, lTrim, del)
|
|||
|
|
|
|||
|
|
#### 文档和测试(6个)
|
|||
|
|
- [x] `WebSocket增强功能实现说明.md`
|
|||
|
|
- [x] `WebSocket增强功能-README.md`
|
|||
|
|
- [x] `测试WebSocket增强功能.html`
|
|||
|
|
- [x] `检查编译问题.md`
|
|||
|
|
- [x] `离线消息功能实现说明.md`
|
|||
|
|
- [x] `测试离线消息功能.html`
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## ✅ 代码修复验证
|
|||
|
|
|
|||
|
|
### 1. RedisUtil方法调用
|
|||
|
|
- [x] `sSet()` 替代 `sAdd()` - OnlineStatusServiceImpl
|
|||
|
|
- [x] `getListSize()` 替代 `lGetListSize()` - OfflineMessageServiceImpl
|
|||
|
|
- [x] Set<Object> 转 Set<String> - OnlineStatusServiceImpl.getRoomOnlineUsers()
|
|||
|
|
|
|||
|
|
### 2. 依赖注入
|
|||
|
|
- [x] OnlineStatusService 注入到 LiveChatHandler
|
|||
|
|
- [x] OnlineStatusService 注入到 PrivateChatHandler
|
|||
|
|
- [x] OfflineMessageService 注入到 PrivateChatHandler
|
|||
|
|
- [x] HeartbeatScheduler 可选注入到 Handler
|
|||
|
|
- [x] RedisUtil 注入到 Service实现类
|
|||
|
|
|
|||
|
|
### 3. 方法签名匹配
|
|||
|
|
- [x] LiveChatService.saveMessage() - 参数正确
|
|||
|
|
- [x] ConversationService.sendMessage() - 参数正确
|
|||
|
|
- [x] ConversationService.markAsRead() - 参数正确
|
|||
|
|
- [x] ConversationService.getById() - 参数正确
|
|||
|
|
|
|||
|
|
### 4. Spring注解
|
|||
|
|
- [x] @Service - 所有Service实现类
|
|||
|
|
- [x] @Component - HeartbeatScheduler和Handler
|
|||
|
|
- [x] @RestController - OnlineStatusController
|
|||
|
|
- [x] @Scheduled - HeartbeatScheduler定时任务
|
|||
|
|
- [x] @EnableScheduling - CrmebFrontApplication
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔧 功能实现验证
|
|||
|
|
|
|||
|
|
### 心跳检测功能
|
|||
|
|
- [x] HeartbeatScheduler 创建完成
|
|||
|
|
- [x] 每30秒发送心跳 (@Scheduled注解)
|
|||
|
|
- [x] 每60秒检查超时 (@Scheduled注解)
|
|||
|
|
- [x] 记录心跳时间 (recordHeartbeat方法)
|
|||
|
|
- [x] 移除心跳记录 (removeHeartbeat方法)
|
|||
|
|
- [x] 构建心跳消息 (buildHeartbeatMessage方法)
|
|||
|
|
- [x] 关闭超时连接 (closeTimeoutSession方法)
|
|||
|
|
- [x] Handler中集成心跳记录
|
|||
|
|
- [x] Handler中处理心跳响应
|
|||
|
|
|
|||
|
|
### 在线状态管理功能
|
|||
|
|
- [x] OnlineStatusService 接口定义
|
|||
|
|
- [x] OnlineStatusServiceImpl 实现
|
|||
|
|
- [x] 设置用户在线/离线
|
|||
|
|
- [x] 检查用户是否在线
|
|||
|
|
- [x] 更新用户活跃时间
|
|||
|
|
- [x] 添加用户到房间
|
|||
|
|
- [x] 从房间移除用户
|
|||
|
|
- [x] 获取房间在线用户
|
|||
|
|
- [x] 获取房间在线人数
|
|||
|
|
- [x] 批量检查在线状态
|
|||
|
|
- [x] Redis Key设计合理
|
|||
|
|
- [x] 自动过期机制(5分钟)
|
|||
|
|
- [x] Handler中集成在线状态
|
|||
|
|
|
|||
|
|
### 离线消息处理功能
|
|||
|
|
- [x] OfflineMessageService 接口定义
|
|||
|
|
- [x] OfflineMessageServiceImpl 实现
|
|||
|
|
- [x] 保存离线消息
|
|||
|
|
- [x] 获取离线消息(分页)
|
|||
|
|
- [x] 获取所有离线消息
|
|||
|
|
- [x] 清除离线消息
|
|||
|
|
- [x] 获取离线消息数量
|
|||
|
|
- [x] 删除指定数量的离线消息
|
|||
|
|
- [x] 消息数量限制(100条)
|
|||
|
|
- [x] 消息过期时间(7天)
|
|||
|
|
- [x] 添加保存时间戳
|
|||
|
|
- [x] PrivateChatHandler中集成
|
|||
|
|
- [x] 连接时推送离线消息
|
|||
|
|
- [x] 发送时检查在线状态
|
|||
|
|
- [x] OfflineMessageController REST API
|
|||
|
|
- [x] OfflineMessageCleanupTask 定时清理
|
|||
|
|
- [x] RedisUtil新增List操作方法
|
|||
|
|
|
|||
|
|
### REST API功能
|
|||
|
|
- [x] OnlineStatusController 创建
|
|||
|
|
- [x] 检查用户在线状态 (GET /status/{userId})
|
|||
|
|
- [x] 批量检查在线状态 (POST /status/batch)
|
|||
|
|
- [x] 获取房间在线用户 (GET /room/{roomId}/users)
|
|||
|
|
- [x] 获取房间在线人数 (GET /room/{roomId}/count)
|
|||
|
|
- [x] 获取离线消息数量 (GET /offline/count/{userId})
|
|||
|
|
- [x] 获取离线消息 (GET /offline/messages/{userId})
|
|||
|
|
- [x] 清除离线消息 (DELETE /offline/messages/{userId})
|
|||
|
|
- [x] 获取连接统计 (GET /stats)
|
|||
|
|
- [x] OfflineMessageController 创建
|
|||
|
|
- [x] 获取离线消息数量 (GET /api/front/offline-messages/count/{userId})
|
|||
|
|
- [x] 获取离线消息列表 (GET /api/front/offline-messages/list/{userId})
|
|||
|
|
- [x] 获取所有离线消息 (GET /api/front/offline-messages/all/{userId})
|
|||
|
|
- [x] 清除离线消息 (DELETE /api/front/offline-messages/clear/{userId})
|
|||
|
|
- [x] 删除指定数量 (DELETE /api/front/offline-messages/remove/{userId})
|
|||
|
|
- [x] 保存离线消息 (POST /api/front/offline-messages/save)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🧪 编译前检查
|
|||
|
|
|
|||
|
|
### 环境准备
|
|||
|
|
- [ ] JDK 8+ 已安装
|
|||
|
|
- [ ] Maven 3.6+ 已安装
|
|||
|
|
- [ ] Redis 5.0+ 已安装并运行
|
|||
|
|
- [ ] 端口8081未被占用
|
|||
|
|
|
|||
|
|
### 依赖检查
|
|||
|
|
- [x] Spring Boot 2.2.6
|
|||
|
|
- [x] Spring WebSocket
|
|||
|
|
- [x] Spring Data Redis
|
|||
|
|
- [x] Jackson (JSON处理)
|
|||
|
|
- [x] MyBatis Plus
|
|||
|
|
- [x] Swagger
|
|||
|
|
|
|||
|
|
### 配置检查
|
|||
|
|
- [ ] application.yml 中 Redis配置正确
|
|||
|
|
- [ ] Redis host: 127.0.0.1
|
|||
|
|
- [ ] Redis port: 6379
|
|||
|
|
- [ ] Redis database: 6
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🚀 编译和启动
|
|||
|
|
|
|||
|
|
### 1. 清理编译
|
|||
|
|
```bash
|
|||
|
|
cd Zhibo/zhibo-h
|
|||
|
|
mvn clean compile
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**预期结果**:
|
|||
|
|
```
|
|||
|
|
[INFO] BUILD SUCCESS
|
|||
|
|
[INFO] Total time: XX s
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. 打包
|
|||
|
|
```bash
|
|||
|
|
mvn clean package -DskipTests
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**预期结果**:
|
|||
|
|
```
|
|||
|
|
[INFO] BUILD SUCCESS
|
|||
|
|
[INFO] jar文件生成在 target/ 目录
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3. 启动服务
|
|||
|
|
```bash
|
|||
|
|
cd crmeb-front
|
|||
|
|
mvn spring-boot:run
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**预期日志**:
|
|||
|
|
```
|
|||
|
|
[INFO] Started CrmebFrontApplication in XX seconds
|
|||
|
|
[INFO] Tomcat started on port(s): 8081
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 4. 验证启动
|
|||
|
|
```bash
|
|||
|
|
# 检查端口
|
|||
|
|
netstat -an | grep 8081
|
|||
|
|
|
|||
|
|
# 检查Redis连接
|
|||
|
|
redis-cli ping
|
|||
|
|
# 应返回: PONG
|
|||
|
|
|
|||
|
|
# 测试API
|
|||
|
|
curl http://localhost:8081/api/front/online/stats
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🧪 功能测试
|
|||
|
|
|
|||
|
|
### 测试1: 心跳检测
|
|||
|
|
**步骤**:
|
|||
|
|
1. 打开 `测试WebSocket增强功能.html`
|
|||
|
|
2. 连接直播间
|
|||
|
|
3. 等待30秒
|
|||
|
|
4. 观察是否收到心跳消息
|
|||
|
|
|
|||
|
|
**预期结果**:
|
|||
|
|
- ✅ 每30秒收到一次心跳消息
|
|||
|
|
- ✅ 消息格式: `{"type":"heartbeat","timestamp":...}`
|
|||
|
|
- ✅ 客户端自动响应心跳
|
|||
|
|
|
|||
|
|
**验证命令**:
|
|||
|
|
```bash
|
|||
|
|
# 查看心跳日志
|
|||
|
|
grep "Heartbeat" logs/application.log
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 测试2: 在线状态
|
|||
|
|
**步骤**:
|
|||
|
|
1. 用户A连接WebSocket
|
|||
|
|
2. 调用API检查用户A在线状态
|
|||
|
|
3. 用户A断开连接
|
|||
|
|
4. 再次检查在线状态
|
|||
|
|
|
|||
|
|
**预期结果**:
|
|||
|
|
- ✅ 连接后: `{"online": true}`
|
|||
|
|
- ✅ 断开后: `{"online": false}`
|
|||
|
|
|
|||
|
|
**验证命令**:
|
|||
|
|
```bash
|
|||
|
|
# 检查用户123的在线状态
|
|||
|
|
curl http://localhost:8081/api/front/online/status/123
|
|||
|
|
|
|||
|
|
# 检查Redis中的数据
|
|||
|
|
redis-cli GET "user:online:123"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 测试3: 离线消息
|
|||
|
|
**步骤**:
|
|||
|
|
1. 用户A连接WebSocket
|
|||
|
|
2. 用户B断开连接(离线)
|
|||
|
|
3. 用户A发送消息给用户B
|
|||
|
|
4. 检查离线消息数量
|
|||
|
|
5. 用户B重新连接
|
|||
|
|
6. 验证是否收到离线消息
|
|||
|
|
|
|||
|
|
**预期结果**:
|
|||
|
|
- ✅ 用户B离线时消息保存到Redis
|
|||
|
|
- ✅ 用户B上线时自动推送消息
|
|||
|
|
- ✅ 推送后离线消息被清除
|
|||
|
|
|
|||
|
|
**验证命令**:
|
|||
|
|
```bash
|
|||
|
|
# 检查用户456的离线消息数量(旧接口)
|
|||
|
|
curl http://localhost:8081/api/front/online/offline/count/456
|
|||
|
|
|
|||
|
|
# 检查用户456的离线消息数量(新接口)
|
|||
|
|
curl http://localhost:8081/api/front/offline-messages/count/456
|
|||
|
|
|
|||
|
|
# 获取离线消息列表
|
|||
|
|
curl http://localhost:8081/api/front/offline-messages/list/456?limit=50
|
|||
|
|
|
|||
|
|
# 获取所有离线消息
|
|||
|
|
curl http://localhost:8081/api/front/offline-messages/all/456
|
|||
|
|
|
|||
|
|
# 查看Redis中的离线消息
|
|||
|
|
redis-cli LRANGE "offline:msg:456" 0 -1
|
|||
|
|
|
|||
|
|
# 删除前5条离线消息
|
|||
|
|
curl -X DELETE "http://localhost:8081/api/front/offline-messages/remove/456?count=5"
|
|||
|
|
|
|||
|
|
# 清空所有离线消息
|
|||
|
|
curl -X DELETE http://localhost:8081/api/front/offline-messages/clear/456
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**使用测试页面**:
|
|||
|
|
1. 打开 `测试离线消息功能.html`
|
|||
|
|
2. 设置用户ID
|
|||
|
|
3. 保存10条测试消息
|
|||
|
|
4. 获取消息列表
|
|||
|
|
5. 删除指定数量
|
|||
|
|
6. 清空所有消息
|
|||
|
|
|
|||
|
|
### 测试4: 房间在线人数
|
|||
|
|
**步骤**:
|
|||
|
|
1. 3个用户连接到房间101
|
|||
|
|
2. 调用API获取房间在线人数
|
|||
|
|
3. 1个用户断开连接
|
|||
|
|
4. 再次获取在线人数
|
|||
|
|
|
|||
|
|
**预期结果**:
|
|||
|
|
- ✅ 3个用户连接后: `{"count": 3}`
|
|||
|
|
- ✅ 1个用户断开后: `{"count": 2}`
|
|||
|
|
|
|||
|
|
**验证命令**:
|
|||
|
|
```bash
|
|||
|
|
# 获取房间101的在线人数
|
|||
|
|
curl http://localhost:8081/api/front/online/room/101/count
|
|||
|
|
|
|||
|
|
# 查看Redis中的房间在线用户
|
|||
|
|
redis-cli SMEMBERS "room:online:101"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 测试5: 超时断开
|
|||
|
|
**步骤**:
|
|||
|
|
1. 连接WebSocket
|
|||
|
|
2. 禁用自动心跳响应
|
|||
|
|
3. 等待90秒
|
|||
|
|
4. 观察连接状态
|
|||
|
|
|
|||
|
|
**预期结果**:
|
|||
|
|
- ✅ 90秒后连接自动断开
|
|||
|
|
- ✅ 日志显示超时信息
|
|||
|
|
|
|||
|
|
**验证命令**:
|
|||
|
|
```bash
|
|||
|
|
# 查看超时日志
|
|||
|
|
grep "连接超时" logs/application.log
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 测试6: REST API
|
|||
|
|
**步骤**: 测试所有8个API接口
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 1. 检查用户在线状态
|
|||
|
|
curl http://localhost:8081/api/front/online/status/123
|
|||
|
|
|
|||
|
|
# 2. 批量检查在线状态
|
|||
|
|
curl -X POST http://localhost:8081/api/front/online/status/batch \
|
|||
|
|
-H "Content-Type: application/json" \
|
|||
|
|
-d "[123, 456, 789]"
|
|||
|
|
|
|||
|
|
# 3. 获取房间在线用户
|
|||
|
|
curl http://localhost:8081/api/front/online/room/101/users
|
|||
|
|
|
|||
|
|
# 4. 获取房间在线人数
|
|||
|
|
curl http://localhost:8081/api/front/online/room/101/count
|
|||
|
|
|
|||
|
|
# 5. 获取离线消息数量
|
|||
|
|
curl http://localhost:8081/api/front/online/offline/count/456
|
|||
|
|
|
|||
|
|
# 6. 获取离线消息
|
|||
|
|
curl http://localhost:8081/api/front/online/offline/messages/456?limit=50
|
|||
|
|
|
|||
|
|
# 7. 清除离线消息
|
|||
|
|
curl -X DELETE http://localhost:8081/api/front/online/offline/messages/456
|
|||
|
|
|
|||
|
|
# 8. 获取连接统计
|
|||
|
|
curl http://localhost:8081/api/front/online/stats
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**预期结果**:
|
|||
|
|
- ✅ 所有接口返回200状态码
|
|||
|
|
- ✅ 返回数据格式正确
|
|||
|
|
- ✅ 数据内容符合预期
|
|||
|
|
|
|||
|
|
### 测试7: 离线消息专用API
|
|||
|
|
**步骤**: 测试离线消息的完整功能
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 1. 保存离线消息
|
|||
|
|
curl -X POST "http://localhost:8081/api/front/offline-messages/save?userId=456" \
|
|||
|
|
-H "Content-Type: application/json" \
|
|||
|
|
-d '{"type":"chat","content":"测试消息","timestamp":1234567890}'
|
|||
|
|
|
|||
|
|
# 2. 批量保存测试消息(使用测试页面)
|
|||
|
|
# 打开 测试离线消息功能.html,点击"保存10条测试消息"
|
|||
|
|
|
|||
|
|
# 3. 获取离线消息数量
|
|||
|
|
curl http://localhost:8081/api/front/offline-messages/count/456
|
|||
|
|
|
|||
|
|
# 4. 获取离线消息列表(限制50条)
|
|||
|
|
curl "http://localhost:8081/api/front/offline-messages/list/456?limit=50"
|
|||
|
|
|
|||
|
|
# 5. 获取所有离线消息
|
|||
|
|
curl http://localhost:8081/api/front/offline-messages/all/456
|
|||
|
|
|
|||
|
|
# 6. 删除前5条离线消息
|
|||
|
|
curl -X DELETE "http://localhost:8081/api/front/offline-messages/remove/456?count=5"
|
|||
|
|
|
|||
|
|
# 7. 清空所有离线消息
|
|||
|
|
curl -X DELETE http://localhost:8081/api/front/offline-messages/clear/456
|
|||
|
|
|
|||
|
|
# 8. 验证清空后的数量
|
|||
|
|
curl http://localhost:8081/api/front/offline-messages/count/456
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**预期结果**:
|
|||
|
|
- ✅ 保存消息成功
|
|||
|
|
- ✅ 获取数量正确
|
|||
|
|
- ✅ 获取列表包含所有消息
|
|||
|
|
- ✅ 删除指定数量成功
|
|||
|
|
- ✅ 清空后数量为0
|
|||
|
|
- ✅ 所有接口返回格式正确
|
|||
|
|
|
|||
|
|
**使用测试页面验证**:
|
|||
|
|
1. 打开 `测试离线消息功能.html`
|
|||
|
|
2. 配置API地址和用户ID
|
|||
|
|
3. 依次测试所有功能按钮
|
|||
|
|
4. 观察返回结果和统计信息
|
|||
|
|
5. 验证Redis中的数据变化
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📊 性能测试
|
|||
|
|
|
|||
|
|
### 并发连接测试
|
|||
|
|
**目标**: 测试100个并发WebSocket连接
|
|||
|
|
|
|||
|
|
**步骤**:
|
|||
|
|
1. 使用测试工具创建100个连接
|
|||
|
|
2. 观察服务器资源使用
|
|||
|
|
3. 检查心跳是否正常
|
|||
|
|
|
|||
|
|
**预期结果**:
|
|||
|
|
- ✅ 所有连接成功建立
|
|||
|
|
- ✅ CPU使用率 < 50%
|
|||
|
|
- ✅ 内存使用正常
|
|||
|
|
- ✅ 心跳消息正常发送
|
|||
|
|
|
|||
|
|
### 消息吞吐量测试
|
|||
|
|
**目标**: 测试1000条消息/秒
|
|||
|
|
|
|||
|
|
**步骤**:
|
|||
|
|
1. 创建10个连接
|
|||
|
|
2. 每个连接每秒发送100条消息
|
|||
|
|
3. 观察消息处理延迟
|
|||
|
|
|
|||
|
|
**预期结果**:
|
|||
|
|
- ✅ 消息无丢失
|
|||
|
|
- ✅ 延迟 < 100ms
|
|||
|
|
- ✅ 服务器稳定运行
|
|||
|
|
|
|||
|
|
### Redis性能测试
|
|||
|
|
**步骤**:
|
|||
|
|
1. 监控Redis内存使用
|
|||
|
|
2. 监控Redis命令执行时间
|
|||
|
|
3. 检查Key过期是否正常
|
|||
|
|
|
|||
|
|
**验证命令**:
|
|||
|
|
```bash
|
|||
|
|
# 查看Redis内存使用
|
|||
|
|
redis-cli INFO memory
|
|||
|
|
|
|||
|
|
# 查看Key数量
|
|||
|
|
redis-cli DBSIZE
|
|||
|
|
|
|||
|
|
# 查看慢查询
|
|||
|
|
redis-cli SLOWLOG GET 10
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**预期结果**:
|
|||
|
|
- ✅ 内存使用合理
|
|||
|
|
- ✅ 命令执行时间 < 10ms
|
|||
|
|
- ✅ Key自动过期正常
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🐛 常见问题排查
|
|||
|
|
|
|||
|
|
### 问题1: 编译失败
|
|||
|
|
**症状**: `mvn compile` 失败
|
|||
|
|
|
|||
|
|
**排查步骤**:
|
|||
|
|
1. 检查JDK版本: `java -version`
|
|||
|
|
2. 检查Maven版本: `mvn -version`
|
|||
|
|
3. 清理缓存: `mvn clean`
|
|||
|
|
4. 查看错误日志
|
|||
|
|
|
|||
|
|
**解决方案**: 参考 `检查编译问题.md`
|
|||
|
|
|
|||
|
|
### 问题2: 启动失败
|
|||
|
|
**症状**: 服务无法启动
|
|||
|
|
|
|||
|
|
**排查步骤**:
|
|||
|
|
1. 检查Redis: `redis-cli ping`
|
|||
|
|
2. 检查端口: `netstat -an | grep 8081`
|
|||
|
|
3. 查看启动日志
|
|||
|
|
4. 检查配置文件
|
|||
|
|
|
|||
|
|
**解决方案**:
|
|||
|
|
- Redis未启动 → 启动Redis
|
|||
|
|
- 端口被占用 → 修改端口或关闭占用进程
|
|||
|
|
- 配置错误 → 检查application.yml
|
|||
|
|
|
|||
|
|
### 问题3: 心跳不工作
|
|||
|
|
**症状**: 没有收到心跳消息
|
|||
|
|
|
|||
|
|
**排查步骤**:
|
|||
|
|
1. 检查@EnableScheduling注解
|
|||
|
|
2. 查看日志: `grep "Heartbeat" logs/application.log`
|
|||
|
|
3. 检查HeartbeatScheduler是否被Spring扫描
|
|||
|
|
|
|||
|
|
**解决方案**:
|
|||
|
|
- 缺少注解 → 添加@EnableScheduling
|
|||
|
|
- 未扫描到 → 检查@ComponentScan配置
|
|||
|
|
|
|||
|
|
### 问题4: 在线状态不准确
|
|||
|
|
**症状**: 用户明明在线但显示离线
|
|||
|
|
|
|||
|
|
**排查步骤**:
|
|||
|
|
1. 检查Redis连接
|
|||
|
|
2. 查看Redis中的数据
|
|||
|
|
3. 检查过期时间设置
|
|||
|
|
|
|||
|
|
**验证命令**:
|
|||
|
|
```bash
|
|||
|
|
# 检查用户在线状态
|
|||
|
|
redis-cli GET "user:online:123"
|
|||
|
|
|
|||
|
|
# 检查Key的TTL
|
|||
|
|
redis-cli TTL "user:online:123"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**解决方案**:
|
|||
|
|
- Redis断开 → 重启Redis
|
|||
|
|
- 过期时间太短 → 调整ONLINE_EXPIRE_SECONDS
|
|||
|
|
- 未更新活跃时间 → 检查updateUserLastActiveTime调用
|
|||
|
|
|
|||
|
|
### 问题5: 离线消息未推送
|
|||
|
|
**症状**: 用户上线后没有收到离线消息
|
|||
|
|
|
|||
|
|
**排查步骤**:
|
|||
|
|
1. 检查Redis中是否有离线消息
|
|||
|
|
2. 查看连接日志
|
|||
|
|
3. 检查推送逻辑
|
|||
|
|
|
|||
|
|
**验证命令**:
|
|||
|
|
```bash
|
|||
|
|
# 查看离线消息
|
|||
|
|
redis-cli LRANGE "offline:msg:456" 0 -1
|
|||
|
|
|
|||
|
|
# 查看推送日志
|
|||
|
|
grep "推送离线消息" logs/application.log
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**解决方案**:
|
|||
|
|
- 消息未保存 → 检查saveOfflineMessage调用
|
|||
|
|
- 推送失败 → 查看异常日志
|
|||
|
|
- 消息已过期 → 检查过期时间设置
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## ✅ 最终验证清单
|
|||
|
|
|
|||
|
|
### 代码层面
|
|||
|
|
- [x] 所有文件已创建
|
|||
|
|
- [x] 所有方法调用正确
|
|||
|
|
- [x] 所有类型转换正确
|
|||
|
|
- [x] 所有依赖注入正确
|
|||
|
|
- [x] 所有注解正确
|
|||
|
|
- [x] 所有异常处理完整
|
|||
|
|
|
|||
|
|
### 功能层面
|
|||
|
|
- [ ] 心跳检测正常工作
|
|||
|
|
- [ ] 在线状态实时更新
|
|||
|
|
- [ ] 离线消息正确保存和推送
|
|||
|
|
- [ ] REST API全部可用
|
|||
|
|
- [ ] 超时断开正常工作
|
|||
|
|
|
|||
|
|
### 性能层面
|
|||
|
|
- [ ] 100个并发连接稳定
|
|||
|
|
- [ ] 消息处理延迟低
|
|||
|
|
- [ ] Redis性能正常
|
|||
|
|
- [ ] 内存使用合理
|
|||
|
|
- [ ] CPU使用率正常
|
|||
|
|
|
|||
|
|
### 文档层面
|
|||
|
|
- [x] 功能说明文档完整
|
|||
|
|
- [x] 快速开始指南完整
|
|||
|
|
- [x] 测试工具可用
|
|||
|
|
- [x] 问题排查指南完整
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎉 验证完成
|
|||
|
|
|
|||
|
|
当所有检查项都打勾后,说明:
|
|||
|
|
|
|||
|
|
✅ **代码实现完整**
|
|||
|
|
✅ **功能测试通过**
|
|||
|
|
✅ **性能满足要求**
|
|||
|
|
✅ **文档齐全**
|
|||
|
|
|
|||
|
|
**可以正式使用了!** 🚀
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**最后更新**: 2024年12月25日
|
|||
|
|
**验证人**: [待填写]
|
|||
|
|
**验证日期**: [待填写]
|
|||
|
|
**验证结果**: [待填写]
|