robot_fenli/robots/majiang/robot_mj_cs/AUTO_RECONNECT_DOC.md

7.2 KiB
Raw Blame History

Robot MJ CS 自动重连功能说明(连接监视器版)

功能概述

为robot_mj_cs客户端实现了基于连接监视器的自动重连机制通过为每个TCP连接启动独立的定时监视器当检测到与game_mj_cs服务端的连接断开时立即自动尝试重新连接,无需发送心跳包来维持连接。

核心特性

1. 自动重连机制

  • 连接监视器模式为每个连接创建独立的8秒间隔定时监视器
  • 双重检测机制:结合连接状态检查和活动时间超时检测
  • 智能重连策略:精确区分主动断开和被动断开
  • 快速响应重连失败后1秒延迟快速重连最小化断连时间
  • 重试次数控制最大10次重连尝试防止资源耗尽

2. 连接状态管理

  • 活跃连接跟踪:实时维护连接状态
  • 重连次数统计:记录每个连接的重连尝试次数
  • 主动断开识别:用户主动断开时不触发重连

3. 监控与日志

  • 独立监视器每个TCP连接拥有专属的定时状态检测线程
  • 实时活动追踪:精确记录每次网络交互的活动时间戳
  • 智能超时验证20秒无通信时主动发送验证消息确认连接状态
  • 全程日志监控:详细记录监视器生命周期、连接状态变迁等关键事件
  • 健壮异常处理:全面的异常捕获和优雅降级处理机制

技术实现

核心组件

RobotConnectionManager (连接管理器)

// 核心组件
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秒快速延迟确保及时响应
  6. reconnectToGameServer() - 执行重连

    • 清理旧连接
    • 建立新连接
    • 复用事件监听器

重连流程

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

配置参数

可调整参数

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秒

使用示例

基本使用

// 创建连接管理器
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中的集成

// 获取或创建连接
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)
    • 实现基础自动重连功能
    • 支持连接状态监控
    • 提供详细的日志记录