delete
parent
80a1937ca5
commit
9b18a28747
|
|
@ -1,236 +0,0 @@
|
||||||
# Robot MJ CS 自动重连功能说明(连接监视器版)
|
|
||||||
|
|
||||||
## 功能概述
|
|
||||||
|
|
||||||
为robot_mj_cs客户端实现了**基于连接监视器的自动重连机制**,通过为每个TCP连接启动独立的定时监视器,当检测到与game_mj_cs服务端的连接断开时,会**立即**自动尝试重新连接,无需发送心跳包来维持连接。
|
|
||||||
|
|
||||||
## 核心特性
|
|
||||||
|
|
||||||
### 1. 自动重连机制
|
|
||||||
- **连接监视器模式**:为每个连接创建独立的8秒间隔定时监视器
|
|
||||||
- **双重检测机制**:结合连接状态检查和活动时间超时检测
|
|
||||||
- **智能重连策略**:精确区分主动断开和被动断开
|
|
||||||
- **快速响应重连**:失败后1秒延迟快速重连,最小化断连时间
|
|
||||||
- **重试次数控制**:最大10次重连尝试,防止资源耗尽
|
|
||||||
|
|
||||||
### 2. 连接状态管理
|
|
||||||
- **活跃连接跟踪**:实时维护连接状态
|
|
||||||
- **重连次数统计**:记录每个连接的重连尝试次数
|
|
||||||
- **主动断开识别**:用户主动断开时不触发重连
|
|
||||||
|
|
||||||
### 3. 监控与日志
|
|
||||||
- **独立监视器**:每个TCP连接拥有专属的定时状态检测线程
|
|
||||||
- **实时活动追踪**:精确记录每次网络交互的活动时间戳
|
|
||||||
- **智能超时验证**:20秒无通信时主动发送验证消息确认连接状态
|
|
||||||
- **全程日志监控**:详细记录监视器生命周期、连接状态变迁等关键事件
|
|
||||||
- **健壮异常处理**:全面的异常捕获和优雅降级处理机制
|
|
||||||
|
|
||||||
## 技术实现
|
|
||||||
|
|
||||||
### 核心组件
|
|
||||||
|
|
||||||
#### RobotConnectionManager (连接管理器)
|
|
||||||
```java
|
|
||||||
// 核心组件
|
|
||||||
private final ScheduledExecutorService reconnectScheduler; // 统一调度器
|
|
||||||
private final Map<String, Boolean> activeConnections; // 连接活跃状态
|
|
||||||
private final Map<String, Integer> reconnectAttempts; // 重连尝试计数
|
|
||||||
private final Map<String, Long> lastActivityTime; // 最后活动时间戳
|
|
||||||
private final Map<String, ScheduledFuture<?>> connectionWatchers; // 连接监视器映射
|
|
||||||
|
|
||||||
// 配置参数
|
|
||||||
private final int MAX_RECONNECT_ATTEMPTS = 10; // 最大重连次数
|
|
||||||
private final int RECONNECT_DELAY_SECONDS = 1; // 重连延迟(秒)
|
|
||||||
private final int CONNECTION_WATCH_INTERVAL = 8; // 监视间隔(秒)
|
|
||||||
private final int CONNECTION_TIMEOUT_SECONDS = 20; // 超时阈值(秒)
|
|
||||||
```
|
|
||||||
|
|
||||||
#### 关键方法
|
|
||||||
|
|
||||||
1. **connectToGameServer()** - 建立新连接
|
|
||||||
- 创建TaurusClient实例
|
|
||||||
- 设置事件监听器
|
|
||||||
- 标记为活跃连接
|
|
||||||
|
|
||||||
2. **handleConnectionFailure()** - 处理连接失败
|
|
||||||
- 区分主动/被动断开
|
|
||||||
- 触发重连流程
|
|
||||||
|
|
||||||
3. **startConnectionWatcher()** - 启动连接监视器
|
|
||||||
- 为指定连接创建专属的定时检测任务
|
|
||||||
- 8秒固定间隔持续监控连接健康状态
|
|
||||||
- 自动管理监视器的生命周期
|
|
||||||
|
|
||||||
4. **monitorConnection()** - 执行连接状态检测
|
|
||||||
- 实时检查底层TCP连接是否存活
|
|
||||||
- 基于最后活动时间判断连接活性
|
|
||||||
- 超时时主动发送验证消息确认状态
|
|
||||||
|
|
||||||
5. **scheduleReconnect()** - 安排重连任务
|
|
||||||
- 智能判断是否需要重连(排除主动断开)
|
|
||||||
- 控制重连尝试次数防止无限循环
|
|
||||||
- 1秒快速延迟确保及时响应
|
|
||||||
|
|
||||||
4. **reconnectToGameServer()** - 执行重连
|
|
||||||
- 清理旧连接
|
|
||||||
- 建立新连接
|
|
||||||
- 复用事件监听器
|
|
||||||
|
|
||||||
### 重连流程
|
|
||||||
|
|
||||||
```mermaid
|
|
||||||
graph TD
|
|
||||||
A[连接建立成功] --> B[启动专属监视器]
|
|
||||||
B --> C[8秒周期性状态检测]
|
|
||||||
C --> D{TCP连接存活?}
|
|
||||||
D -->|否| E[立即触发重连流程]
|
|
||||||
D -->|是| F[检查通信活性]
|
|
||||||
F --> G{超过20秒无通信?}
|
|
||||||
G -->|是| H[发送PING验证]
|
|
||||||
G -->|否| C
|
|
||||||
H --> I{验证响应正常?}
|
|
||||||
I -->|否| E
|
|
||||||
I -->|是| J[刷新活动时间]
|
|
||||||
J --> C
|
|
||||||
E --> K{用户主动断开?}
|
|
||||||
K -->|是| L[清理监视器资源]
|
|
||||||
K -->|否| M[检查重试次数]
|
|
||||||
M --> N{重试次数<10?}
|
|
||||||
N -->|否| O[终止重连尝试]
|
|
||||||
N -->|是| P[1秒后执行重连]
|
|
||||||
P --> Q[重建TCP连接]
|
|
||||||
Q --> R{连接重建成功?}
|
|
||||||
R -->|是| S[重启监视器]
|
|
||||||
R -->|否| M
|
|
||||||
|
|
||||||
T[用户主动断开] --> U[停止监视器]
|
|
||||||
U --> L
|
|
||||||
```
|
|
||||||
|
|
||||||
## 配置参数
|
|
||||||
|
|
||||||
### 可调整参数
|
|
||||||
|
|
||||||
```java
|
|
||||||
private final int MAX_RECONNECT_ATTEMPTS = 10; // 最大重连尝试次数
|
|
||||||
private final int RECONNECT_DELAY_SECONDS = 5; // 重连间隔秒数
|
|
||||||
private final int CONNECTION_MONITOR_INTERVAL = 30; // 连接监控间隔秒数
|
|
||||||
```
|
|
||||||
|
|
||||||
### 参数调优建议
|
|
||||||
|
|
||||||
- **MAX_RECONNECT_ATTEMPTS**: 根据网络稳定性调整
|
|
||||||
- 网络稳定环境:5-10次
|
|
||||||
- 网络不稳定环境:15-20次
|
|
||||||
|
|
||||||
- **RECONNECT_DELAY_SECONDS**: 重连响应速度
|
|
||||||
- 默认:1秒(快速响应)
|
|
||||||
- 可根据需要调整至0-3秒
|
|
||||||
|
|
||||||
- **CONNECTION_WATCH_INTERVAL**: 监视器检测频率
|
|
||||||
- 默认:8秒(平衡性能与响应速度)
|
|
||||||
- 高频场景:可调至5秒
|
|
||||||
- 低频场景:可调至10-15秒
|
|
||||||
|
|
||||||
- **CONNECTION_TIMEOUT_SECONDS**: 连接活性超时阈值
|
|
||||||
- 默认:20秒(适应大多数网络环境)
|
|
||||||
- 敏感业务:可调至15秒
|
|
||||||
- 宽松环境:可调至25-30秒
|
|
||||||
|
|
||||||
- **CONNECTION_MONITOR_INTERVAL**: 根据实时性要求调整
|
|
||||||
- 高实时性:15-30秒
|
|
||||||
- 一般应用:30-60秒
|
|
||||||
|
|
||||||
## 使用示例
|
|
||||||
|
|
||||||
### 基本使用
|
|
||||||
|
|
||||||
```java
|
|
||||||
// 创建连接管理器
|
|
||||||
RobotConnectionManager connectionManager = new RobotConnectionManager();
|
|
||||||
|
|
||||||
// 连接到游戏服务器
|
|
||||||
TaurusClient client = connectionManager.connectToGameServer("robot_123_room_456");
|
|
||||||
|
|
||||||
// 正常使用连接...
|
|
||||||
client.send("protocol", params, callback);
|
|
||||||
|
|
||||||
// 主动断开连接(不会触发重连)
|
|
||||||
connectionManager.disconnectFromGameServer("robot_123_room_456");
|
|
||||||
|
|
||||||
// 关闭连接管理器
|
|
||||||
connectionManager.shutdown();
|
|
||||||
```
|
|
||||||
|
|
||||||
### 在EXGameController中的集成
|
|
||||||
|
|
||||||
```java
|
|
||||||
// 获取或创建连接
|
|
||||||
public static TaurusClient getCsMjGameServerConnection(String connecId) {
|
|
||||||
TaurusClient taurusClient = connectionManager.getGameClient(connecId);
|
|
||||||
if (taurusClient != null) {
|
|
||||||
return taurusClient;
|
|
||||||
}
|
|
||||||
// 自动创建新连接
|
|
||||||
return connectionManager.connectToGameServer(connecId);
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## 日志输出示例
|
|
||||||
|
|
||||||
```
|
|
||||||
INFO 连接成功: robot_123_room_456
|
|
||||||
WARN 连接断开: robot_123_room_456, 原因: TimeoutDisconnect
|
|
||||||
INFO 安排重连任务: robot_123_room_456, 第1次尝试
|
|
||||||
INFO 开始重连: robot_123_room_456
|
|
||||||
INFO 重连成功: robot_123_room_456
|
|
||||||
```
|
|
||||||
|
|
||||||
## 注意事项
|
|
||||||
|
|
||||||
### 1. 资源管理
|
|
||||||
- 确保在应用关闭时调用`shutdown()`方法
|
|
||||||
- 避免连接泄露和线程泄露
|
|
||||||
|
|
||||||
### 2. 性能考虑
|
|
||||||
- 重连调度器使用固定线程池
|
|
||||||
- 避免同时大量重连造成系统压力
|
|
||||||
|
|
||||||
### 3. 异常处理
|
|
||||||
- 网络异常会被捕获并记录
|
|
||||||
- 重连失败会继续尝试直到达到最大次数
|
|
||||||
|
|
||||||
### 4. 与现有代码兼容性
|
|
||||||
- 保持原有API不变
|
|
||||||
- 无缝集成到现有业务逻辑中
|
|
||||||
|
|
||||||
## 故障排除
|
|
||||||
|
|
||||||
### 常见问题
|
|
||||||
|
|
||||||
1. **重连过于频繁**
|
|
||||||
- 调整`RECONNECT_DELAY_SECONDS`参数
|
|
||||||
- 检查网络连接质量
|
|
||||||
|
|
||||||
2. **达到最大重连次数后不再重连**
|
|
||||||
- 检查服务端是否正常运行
|
|
||||||
- 考虑增加`MAX_RECONNECT_ATTEMPTS`
|
|
||||||
|
|
||||||
3. **内存泄漏**
|
|
||||||
- 确保正确调用`shutdown()`方法
|
|
||||||
- 检查是否有未清理的连接引用
|
|
||||||
|
|
||||||
### 监控指标
|
|
||||||
|
|
||||||
建议监控以下指标:
|
|
||||||
- 当前活跃连接数
|
|
||||||
- 重连尝试次数分布
|
|
||||||
- 连接成功率
|
|
||||||
- 平均重连耗时
|
|
||||||
|
|
||||||
## 版本历史
|
|
||||||
|
|
||||||
- **v1.0.0** (2026-02-03)
|
|
||||||
- 实现基础自动重连功能
|
|
||||||
- 支持连接状态监控
|
|
||||||
- 提供详细的日志记录
|
|
||||||
|
|
@ -1,41 +0,0 @@
|
||||||
// 测试断开连接逻辑的简化示例
|
|
||||||
|
|
||||||
public class DisconnectTest {
|
|
||||||
|
|
||||||
// 模拟现有的断开逻辑
|
|
||||||
public void disconnectFromGameServer(String connecId) {
|
|
||||||
System.out.println("=== 断开连接流程 ===");
|
|
||||||
|
|
||||||
// 1. 标记为非活跃
|
|
||||||
System.out.println("1. 标记连接为非活跃状态");
|
|
||||||
|
|
||||||
// 2. 停止监视器(定时任务)
|
|
||||||
System.out.println("2. 停止连接监视器定时任务");
|
|
||||||
// 这里会 cancel ScheduledFuture 任务
|
|
||||||
|
|
||||||
// 3. 移除事件监听器
|
|
||||||
System.out.println("3. 移除 TaurusClient 事件监听器");
|
|
||||||
// 这里会调用 client.removeEventListener()
|
|
||||||
|
|
||||||
// 4. 物理断开连接
|
|
||||||
System.out.println("4. 物理断开 TCP 连接");
|
|
||||||
|
|
||||||
System.out.println("=== 断开完成 ===\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void main(String[] args) {
|
|
||||||
DisconnectTest test = new DisconnectTest();
|
|
||||||
|
|
||||||
System.out.println("场景1: 正常主动断开");
|
|
||||||
test.disconnectFromGameServer("robot_123");
|
|
||||||
|
|
||||||
System.out.println("场景2: 如果只移除事件监听器会发生什么?");
|
|
||||||
System.out.println("- 定时任务仍在后台运行");
|
|
||||||
System.out.println("- 可能会继续尝试检测已断开的连接");
|
|
||||||
System.out.println("- 造成资源浪费和潜在的并发问题\n");
|
|
||||||
|
|
||||||
System.out.println("结论: 两个操作缺一不可!");
|
|
||||||
System.out.println("• removeEventListeners: 防止接收网络事件");
|
|
||||||
System.out.println("• stopConnectionWatcher: 释放定时任务资源");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Loading…
Reference in New Issue