|
|
|
@ -2,6 +2,68 @@ |
|
|
|
|
|
|
|
## 2025-08-12 |
|
|
|
|
|
|
|
### WebSocket心跳任务启动时机修复 |
|
|
|
**问题**:心跳任务应该在客户端连接成功后才启动,而不是在创建客户端时就启动 |
|
|
|
|
|
|
|
**解决方案**: |
|
|
|
1. 修改`create_client`方法,移除心跳任务启动逻辑 |
|
|
|
2. 在`connect_client`方法中添加心跳任务启动逻辑 |
|
|
|
3. 为WebSocketClient类添加heartbeat_interval属性 |
|
|
|
|
|
|
|
**文件变更**: |
|
|
|
- 更新 `app/core/websocket/manager.py` - 修改心跳任务启动时机 |
|
|
|
- 更新 `app/core/websocket/client.py` - 添加heartbeat_interval属性 |
|
|
|
|
|
|
|
**修改内容**: |
|
|
|
|
|
|
|
1. **create_client方法优化**: |
|
|
|
```python |
|
|
|
async def create_client(self, name: str, url: str, heartbeat_interval: int = 120) -> WebSocketClient: |
|
|
|
# ... 创建客户端和Channel ... |
|
|
|
|
|
|
|
# 保存心跳间隔配置,在连接成功后启动 |
|
|
|
client.heartbeat_interval = heartbeat_interval |
|
|
|
|
|
|
|
logger.info(f"WebSocket管理器创建客户端: {name} -> {url}") |
|
|
|
return client |
|
|
|
``` |
|
|
|
|
|
|
|
2. **connect_client方法增强**: |
|
|
|
```python |
|
|
|
async def connect_client(self, name: str) -> bool: |
|
|
|
# 连接客户端 |
|
|
|
success = await client.connect() |
|
|
|
|
|
|
|
# 如果连接成功,启动心跳任务 |
|
|
|
if success and hasattr(client, 'heartbeat_interval'): |
|
|
|
try: |
|
|
|
await self._start_heartbeat_task(name, client.heartbeat_interval) |
|
|
|
logger.info(f"WebSocket管理器连接成功后启动心跳任务: {name}") |
|
|
|
except Exception as e: |
|
|
|
logger.error(f"心跳任务启动失败: {name} - {e}") |
|
|
|
|
|
|
|
return success |
|
|
|
``` |
|
|
|
|
|
|
|
3. **WebSocketClient类增强**: |
|
|
|
```python |
|
|
|
def __init__(self, url: str, name: str = "default"): |
|
|
|
# ... 其他属性 ... |
|
|
|
self.heartbeat_interval: Optional[int] = None # 心跳间隔配置 |
|
|
|
``` |
|
|
|
|
|
|
|
**优化效果**: |
|
|
|
- ✅ 心跳任务在连接成功后启动,避免无效的心跳 |
|
|
|
- ✅ 心跳间隔配置保存在客户端对象中 |
|
|
|
- ✅ 连接失败时不会启动心跳任务 |
|
|
|
- ✅ 更好的资源管理和错误处理 |
|
|
|
|
|
|
|
**设计原则**: |
|
|
|
- 心跳任务只在连接成功时启动 |
|
|
|
- 心跳间隔配置与客户端绑定 |
|
|
|
- 连接失败时不会产生无效的心跳任务 |
|
|
|
- 保持清晰的职责分离 |
|
|
|
|
|
|
|
### 日志系统完全统一 - 移除冗余文件 |
|
|
|
**问题**:项目前期不需要向后兼容,`log.py` 文件造成冗余和混乱 |
|
|
|
- `get_enhanced_logger()` 只是简单包装了 `get_structured_logger()` |
|
|
|
@ -1619,3 +1681,8 @@ client = await websocket_manager.create_client("test_1", "ws://localhost:8080", |
|
|
|
1. 创建WebSocket客户端并检查日志中是否出现心跳任务启动信息 |
|
|
|
2. 验证心跳消息是否正常发送 |
|
|
|
3. 测试异常情况下的心跳任务启动 |
|
|
|
|
|
|
|
### 补充说明 |
|
|
|
- 心跳数据格式保持为 `{"Message": "ping"}`,与原有格式一致 |
|
|
|
- 心跳循环现在会在客户端存在时持续运行,无论连接状态如何 |
|
|
|
- 这样可以确保心跳机制在客户端创建后立即开始工作 |