diff --git a/core/screenshot_handler.py b/core/screenshot_handler.py index 8eb033a..4dc8010 100644 --- a/core/screenshot_handler.py +++ b/core/screenshot_handler.py @@ -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) # ==================== 请求处理 ====================