Class ReconnectPolicy
java.lang.Object
io.github.theword.queqiao.core.websocket.ReconnectPolicy
重连退避策略
纯逻辑组件:不依赖网络、线程、全局状态,可独立单元测试。
由 WsClient 在计算下一次自动重连延迟时使用。
契约(不变量):
- 返回的延迟始终满足
MIN_RECONNECT_DELAY_SECONDS <= delay <= MAX_RECONNECT_DELAY_SECONDS - 绝不产生负数延迟(负数交给 scheduler 会被当作立即执行,形成重连风暴)
- 计算过程不使用位移,避免
1L << attempt在 attempt >= 63 时溢出为负
- Since:
- 0.6.11
-
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final long重连延迟上限(秒)static final long重连延迟下限(秒) -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionlongcalculateReconnectDelay(int attempt) 计算第 attempt 次重连的延迟booleancanAttempt(int attempt) 判断是否还允许继续自动重连long获取归一化后的基础重连间隔(秒)int获取归一化后的最大自动重连次数boolean是否启用了自动重连static longnormalizeBaseInterval(int baseIntervalSeconds) 归一化基础重连间隔
-
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 表示不自动重连
-