修复:截图处理器 Redis 断线后无法自动重连的死循环

- 重连失败时不再置 cloud_redis=None,避免后续循环走错分支
- except Exception 分支增加 cloud_redis is None 判断,主动触发重连
- 重连成功后重置退避计时器
This commit is contained in:
2026-03-25 10:27:49 +08:00
parent 3681f35b69
commit 749257cb8a

View File

@@ -127,12 +127,12 @@ class ScreenshotHandler:
# ==================== 重连 ====================
def _reconnect_cloud_redis(self):
"""重建云端 Redis 连接"""
def _reconnect_cloud_redis(self) -> bool:
"""重建云端 Redis 连接,返回是否成功"""
try:
from core.config_sync import _build_keepalive_options
cfg = self._settings.cloud_redis
self._cloud_redis = redis.Redis(
new_client = redis.Redis(
host=cfg.host,
port=cfg.port,
db=cfg.db,
@@ -145,11 +145,14 @@ class ScreenshotHandler:
socket_keepalive_options=_build_keepalive_options(),
health_check_interval=15,
)
self._cloud_redis.ping()
new_client.ping()
self._cloud_redis = new_client
logger.info("[截图] 云端 Redis 重连成功")
return True
except Exception as e:
logger.warning("[截图] 云端 Redis 重连失败: %s", e)
self._cloud_redis = None
# 不置 None避免后续循环永远无法触发 ConnectionError 重连
return False
# ==================== 主循环 ====================
@@ -196,16 +199,25 @@ class ScreenshotHandler:
if self._stop_event.is_set():
return
logger.warning("[截图] 云端 Redis 连接断开: %s, %ds 后重连...", e, backoff)
self._reconnect_cloud_redis()
self._stop_event.wait(backoff)
self._reconnect_cloud_redis()
backoff = min(backoff * 2, max_backoff)
except Exception as e:
if self._stop_event.is_set():
return
logger.warning("[截图] 监听异常: %s, %ds 后重试", e, backoff)
self._stop_event.wait(backoff)
backoff = min(backoff * 2, max_backoff)
# cloud_redis 为 None 时主动重连,避免死循环
if self._cloud_redis is None:
logger.warning("[截图] 云端 Redis 未连接, %ds 后重连...", backoff)
self._stop_event.wait(backoff)
if self._reconnect_cloud_redis():
backoff = 5 # 重连成功,重置退避
else:
backoff = min(backoff * 2, max_backoff)
else:
logger.warning("[截图] 监听异常: %s, %ds 后重试", e, backoff)
self._stop_event.wait(backoff)
backoff = min(backoff * 2, max_backoff)
# ==================== 请求处理 ====================