340 lines
6.6 KiB
Markdown
340 lines
6.6 KiB
Markdown
|
|
# 离线消息功能 - 快速开始指南
|
|||
|
|
|
|||
|
|
## 🚀 5分钟快速测试
|
|||
|
|
|
|||
|
|
### 前提条件
|
|||
|
|
|
|||
|
|
确保以下服务已启动:
|
|||
|
|
- ✅ Redis (端口6379)
|
|||
|
|
- ✅ 后端服务 (端口8081)
|
|||
|
|
|
|||
|
|
### 步骤1: 启动服务
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 进入项目目录
|
|||
|
|
cd Zhibo/zhibo-h
|
|||
|
|
|
|||
|
|
# 启动后端服务
|
|||
|
|
cd crmeb-front
|
|||
|
|
mvn spring-boot:run
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
等待看到以下日志:
|
|||
|
|
```
|
|||
|
|
Started CrmebFrontApplication in XX seconds
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 步骤2: 打开测试页面
|
|||
|
|
|
|||
|
|
在浏览器中打开:
|
|||
|
|
```
|
|||
|
|
Zhibo/测试离线消息功能.html
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 步骤3: 配置测试参数
|
|||
|
|
|
|||
|
|
在测试页面中:
|
|||
|
|
1. **API基础地址**: `http://localhost:8081` (默认)
|
|||
|
|
2. **用户ID**: `1` (可以修改为任意数字)
|
|||
|
|
|
|||
|
|
### 步骤4: 测试保存消息
|
|||
|
|
|
|||
|
|
点击 **"保存10条测试消息"** 按钮
|
|||
|
|
|
|||
|
|
**预期结果**:
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"success": true,
|
|||
|
|
"message": "成功保存 10 条测试消息"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 步骤5: 查看消息
|
|||
|
|
|
|||
|
|
点击 **"获取消息列表"** 按钮
|
|||
|
|
|
|||
|
|
**预期结果**:
|
|||
|
|
- 显示统计卡片:消息数量 = 10
|
|||
|
|
- 显示消息列表,包含10条测试消息
|
|||
|
|
- 每条消息显示内容和时间戳
|
|||
|
|
|
|||
|
|
### 步骤6: 删除消息
|
|||
|
|
|
|||
|
|
1. 在 **"删除数量"** 输入框中输入 `5`
|
|||
|
|
2. 点击 **"删除指定数量"** 按钮
|
|||
|
|
|
|||
|
|
**预期结果**:
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"code": 200,
|
|||
|
|
"message": "删除离线消息成功"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 步骤7: 验证删除
|
|||
|
|
|
|||
|
|
再次点击 **"获取消息数量"** 按钮
|
|||
|
|
|
|||
|
|
**预期结果**:
|
|||
|
|
- 消息数量 = 5 (原来10条,删除了5条)
|
|||
|
|
|
|||
|
|
### 步骤8: 清空消息
|
|||
|
|
|
|||
|
|
点击 **"清空所有消息"** 按钮,确认操作
|
|||
|
|
|
|||
|
|
**预期结果**:
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"code": 200,
|
|||
|
|
"message": "清除离线消息成功"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 步骤9: 验证清空
|
|||
|
|
|
|||
|
|
再次点击 **"获取消息数量"** 按钮
|
|||
|
|
|
|||
|
|
**预期结果**:
|
|||
|
|
- 消息数量 = 0
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🧪 使用命令行测试
|
|||
|
|
|
|||
|
|
### 测试1: 保存消息
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
curl -X POST "http://localhost:8081/api/front/offline-messages/save?userId=1" \
|
|||
|
|
-H "Content-Type: application/json" \
|
|||
|
|
-d '{"type":"chat","content":"Hello World","timestamp":1234567890}'
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 测试2: 获取数量
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
curl http://localhost:8081/api/front/offline-messages/count/1
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 测试3: 获取列表
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
curl "http://localhost:8081/api/front/offline-messages/list/1?limit=50"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 测试4: 删除消息
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
curl -X DELETE "http://localhost:8081/api/front/offline-messages/remove/1?count=5"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 测试5: 清空消息
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
curl -X DELETE http://localhost:8081/api/front/offline-messages/clear/1
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔍 使用Redis CLI验证
|
|||
|
|
|
|||
|
|
### 查看离线消息
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 查看用户1的所有离线消息
|
|||
|
|
redis-cli LRANGE offline:msg:1 0 -1
|
|||
|
|
|
|||
|
|
# 查看消息数量
|
|||
|
|
redis-cli LLEN offline:msg:1
|
|||
|
|
|
|||
|
|
# 查看过期时间(秒)
|
|||
|
|
redis-cli TTL offline:msg:1
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 手动操作
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 手动添加消息
|
|||
|
|
redis-cli LPUSH offline:msg:1 '{"type":"chat","content":"测试"}'
|
|||
|
|
|
|||
|
|
# 手动删除消息
|
|||
|
|
redis-cli DEL offline:msg:1
|
|||
|
|
|
|||
|
|
# 查看所有离线消息Key
|
|||
|
|
redis-cli KEYS "offline:msg:*"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎯 完整测试流程
|
|||
|
|
|
|||
|
|
### 场景: 用户离线时收到消息
|
|||
|
|
|
|||
|
|
#### 1. 用户A和用户B都在线
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 打开两个浏览器窗口
|
|||
|
|
# 窗口1: 用户A (userId=1) 连接WebSocket
|
|||
|
|
# 窗口2: 用户B (userId=2) 连接WebSocket
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 2. 用户B断开连接(模拟离线)
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 关闭窗口2的WebSocket连接
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 3. 用户A发送消息给用户B
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 在窗口1中发送消息
|
|||
|
|
# 消息会被保存到Redis: offline:msg:2
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 4. 验证离线消息已保存
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 查看用户B的离线消息数量
|
|||
|
|
curl http://localhost:8081/api/front/offline-messages/count/2
|
|||
|
|
|
|||
|
|
# 或使用Redis CLI
|
|||
|
|
redis-cli LLEN offline:msg:2
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 5. 用户B重新上线
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 重新打开窗口2,用户B连接WebSocket
|
|||
|
|
# 系统会自动推送离线消息
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 6. 验证离线消息已推送并清除
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 再次查看用户B的离线消息数量
|
|||
|
|
curl http://localhost:8081/api/front/offline-messages/count/2
|
|||
|
|
# 应该返回 0,因为消息已推送并清除
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📊 监控和调试
|
|||
|
|
|
|||
|
|
### 查看日志
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 查看离线消息相关日志
|
|||
|
|
grep "OfflineMessage" logs/application.log
|
|||
|
|
|
|||
|
|
# 查看保存消息日志
|
|||
|
|
grep "保存离线消息" logs/application.log
|
|||
|
|
|
|||
|
|
# 查看推送消息日志
|
|||
|
|
grep "推送离线消息" logs/application.log
|
|||
|
|
|
|||
|
|
# 查看清除消息日志
|
|||
|
|
grep "清除离线消息" logs/application.log
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 监控Redis
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 实时监控Redis命令
|
|||
|
|
redis-cli MONITOR
|
|||
|
|
|
|||
|
|
# 查看Redis内存使用
|
|||
|
|
redis-cli INFO memory
|
|||
|
|
|
|||
|
|
# 查看Key数量
|
|||
|
|
redis-cli DBSIZE
|
|||
|
|
|
|||
|
|
# 查看离线消息Key的数量
|
|||
|
|
redis-cli KEYS "offline:msg:*" | wc -l
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 性能测试
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 批量保存1000条消息
|
|||
|
|
for i in {1..1000}; do
|
|||
|
|
curl -X POST "http://localhost:8081/api/front/offline-messages/save?userId=1" \
|
|||
|
|
-H "Content-Type: application/json" \
|
|||
|
|
-d "{\"type\":\"chat\",\"content\":\"Message $i\",\"timestamp\":$(date +%s)}" \
|
|||
|
|
> /dev/null 2>&1
|
|||
|
|
done
|
|||
|
|
|
|||
|
|
# 查看消息数量(应该只有100条,因为有数量限制)
|
|||
|
|
curl http://localhost:8081/api/front/offline-messages/count/1
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## ❓ 常见问题
|
|||
|
|
|
|||
|
|
### Q1: 消息没有保存?
|
|||
|
|
|
|||
|
|
**检查步骤**:
|
|||
|
|
1. Redis是否运行: `redis-cli ping`
|
|||
|
|
2. 后端服务是否启动: `curl http://localhost:8081/api/front/online/stats`
|
|||
|
|
3. 查看错误日志: `grep "ERROR" logs/application.log`
|
|||
|
|
|
|||
|
|
### Q2: 消息没有推送?
|
|||
|
|
|
|||
|
|
**检查步骤**:
|
|||
|
|
1. 用户是否真的离线: `curl http://localhost:8081/api/front/online/status/用户ID`
|
|||
|
|
2. WebSocket是否连接成功
|
|||
|
|
3. 查看推送日志: `grep "推送离线消息" logs/application.log`
|
|||
|
|
|
|||
|
|
### Q3: 消息数量不对?
|
|||
|
|
|
|||
|
|
**原因**:
|
|||
|
|
- 离线消息最多保存100条
|
|||
|
|
- 超过100条会自动删除最旧的消息
|
|||
|
|
- 消息会在7天后自动过期
|
|||
|
|
|
|||
|
|
**解决方法**:
|
|||
|
|
- 修改 `MAX_OFFLINE_MESSAGES` 常量
|
|||
|
|
- 修改 `OFFLINE_MESSAGE_EXPIRE_SECONDS` 常量
|
|||
|
|
|
|||
|
|
### Q4: Redis中看不到数据?
|
|||
|
|
|
|||
|
|
**可能原因**:
|
|||
|
|
1. 消息已过期被删除
|
|||
|
|
2. 消息已被推送并清除
|
|||
|
|
3. Redis数据库选择错误(应该是database 0)
|
|||
|
|
|
|||
|
|
**验证方法**:
|
|||
|
|
```bash
|
|||
|
|
# 确保使用正确的数据库
|
|||
|
|
redis-cli -n 0 KEYS "offline:msg:*"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎉 测试成功标志
|
|||
|
|
|
|||
|
|
当你完成以上所有步骤后,应该看到:
|
|||
|
|
|
|||
|
|
✅ 消息可以成功保存
|
|||
|
|
✅ 消息可以正确获取
|
|||
|
|
✅ 消息可以删除指定数量
|
|||
|
|
✅ 消息可以全部清空
|
|||
|
|
✅ 用户上线时自动推送
|
|||
|
|
✅ 推送后自动清除
|
|||
|
|
✅ Redis中数据正确
|
|||
|
|
✅ 日志记录完整
|
|||
|
|
|
|||
|
|
**恭喜!离线消息功能已经可以正常使用了!** 🚀
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📚 下一步
|
|||
|
|
|
|||
|
|
- 阅读 [离线消息功能实现说明.md](./离线消息功能实现说明.md) 了解详细实现
|
|||
|
|
- 阅读 [功能验证清单.md](./功能验证清单.md) 进行完整测试
|
|||
|
|
- 阅读 [直播IM系统开发指南.md](./直播IM系统开发指南.md) 了解整体架构
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**文档版本**: v1.0
|
|||
|
|
**最后更新**: 2024-12-25
|