Class ReconnectPolicy

java.lang.Object
io.github.theword.queqiao.core.websocket.ReconnectPolicy

public final class ReconnectPolicy extends Object
重连退避策略

纯逻辑组件:不依赖网络、线程、全局状态,可独立单元测试。

由 WsClient 在计算下一次自动重连延迟时使用。

契约(不变量):

  • 返回的延迟始终满足 MIN_RECONNECT_DELAY_SECONDS <= delay <= MAX_RECONNECT_DELAY_SECONDS
  • 绝不产生负数延迟(负数交给 scheduler 会被当作立即执行,形成重连风暴)
  • 计算过程不使用位移,避免 1L << attempt 在 attempt >= 63 时溢出为负
Since:
0.6.11
  • Field Details

    • MAX_RECONNECT_DELAY_SECONDS

      public static final long MAX_RECONNECT_DELAY_SECONDS
      重连延迟上限(秒)
      See Also:
    • MIN_RECONNECT_DELAY_SECONDS

      public static final long MIN_RECONNECT_DELAY_SECONDS
      重连延迟下限(秒)

      当配置的间隔非法(负数或 0)时,回退到该值。

      See Also:
  • Constructor Details

    • ReconnectPolicy

      public ReconnectPolicy(int baseIntervalSeconds, int maxAttempts)
      构造重连策略
      Parameters:
      baseIntervalSeconds - 配置中的基础重连间隔(秒),非法值会被归一化
      maxAttempts - 配置中的最大重连次数,负数会被归一化为 0
  • Method Details

    • normalizeBaseInterval

      public static long normalizeBaseInterval(int baseIntervalSeconds)
      归一化基础重连间隔
      Parameters:
      baseIntervalSeconds - 原始间隔(秒)
      Returns:
      落在 [MIN_RECONNECT_DELAY_SECONDS, MAX_RECONNECT_DELAY_SECONDS] 内的间隔
    • calculateReconnectDelay

      public long calculateReconnectDelay(int attempt)
      计算第 attempt 次重连的延迟

      退避方式为指数增长并封顶:min(base * 2^attempt, MAX)。 由于每步乘法前都已受 MAX 约束(delay < MAX 才继续翻倍), 因此不存在乘法溢出;循环次数上界为 log2(MAX / base), 传入 Integer.MAX_VALUE 也不会退化。

      Parameters:
      attempt - 连续失败次数,从 0 开始;负数按 0 处理
      Returns:
      延迟秒数,恒落在 [MIN, MAX] 内
    • canAttempt

      public boolean canAttempt(int attempt)
      判断是否还允许继续自动重连
      Parameters:
      attempt - 当前已连续失败的次数
      Returns:
      true 表示允许再安排一次重连
    • isAutoReconnectEnabled

      public boolean isAutoReconnectEnabled()
      是否启用了自动重连
      Returns:
      maxAttempts > 0 时为 true
    • getBaseIntervalSeconds

      public long getBaseIntervalSeconds()
      获取归一化后的基础重连间隔(秒)
      Returns:
      基础间隔
    • getMaxAttempts

      public int getMaxAttempts()
      获取归一化后的最大自动重连次数
      Returns:
      最大次数,0 表示不自动重连