""" 后台定时任务管理 - 管理端专用 密钥过期检查与自动生成已拆至独立工程 api-key-tasks,此处仅保留配置刷新等任务。 """ import asyncio from typing import List from contextlib import asynccontextmanager from app.core.logger import logger from app.core.config_cache import config_cache from app.models.system_config import SystemConfig class BackgroundTaskManager: """后台任务管理器(不含密钥定时生成,由 api-key-tasks 独立进程负责)""" def __init__(self): self.tasks: List[asyncio.Task] = [] self.running = False async def start_all_tasks(self): """启动所有后台任务""" if self.running: logger.warning("后台任务已在运行") return self.running = True logger.info("启动后台定时任务...") # 加载配置并设置刷新间隔 config_cache.load_configs() refresh_interval = SystemConfig.get_config_value('admin_config_refresh_interval_seconds', 60) config_cache.set_refresh_interval(refresh_interval) logger.info(f"配置刷新间隔: {refresh_interval} 秒") # 仅启动配置刷新任务;密钥过期检查由 api-key-tasks 工程独立运行 self.tasks = [ asyncio.create_task(self._config_refresh_task()), ] logger.info(f"已启动 {len(self.tasks)} 个后台任务") async def stop_all_tasks(self): """停止所有后台任务""" if not self.running: logger.warning("后台任务未运行") return logger.info("停止后台定时任务...") self.running = False for task in self.tasks: if not task.done(): task.cancel() try: await asyncio.gather(*self.tasks, return_exceptions=True) except asyncio.CancelledError: pass self.tasks.clear() logger.info("后台定时任务已停止") async def _config_refresh_task(self): """配置刷新任务 - 定时从数据库刷新配置缓存""" refresh_interval = config_cache.get_refresh_interval() logger.info(f"启动配置刷新任务 (刷新间隔: {refresh_interval}秒)") while self.running: try: success = config_cache.refresh() if success: logger.debug(f"配置刷新成功,上次刷新时间: {config_cache.get_last_refresh_time()}") else: logger.warning("配置刷新失败") except Exception as e: logger.exception("配置刷新任务异常") # 动态获取刷新间隔(支持运行时修改) current_interval = config_cache.get_refresh_interval() await asyncio.sleep(current_interval) # 全局后台任务管理器实例 background_task_manager = BackgroundTaskManager() @asynccontextmanager async def lifespan_manager(app): """FastAPI lifespan 事件管理器""" logger.info("应用启动,开始初始化后台任务...") await background_task_manager.start_all_tasks() yield logger.info("应用关闭,开始清理后台任务...") await background_task_manager.stop_all_tasks() # 便捷函数 async def start_background_tasks(): """启动后台任务(手动调用)""" await background_task_manager.start_all_tasks() async def stop_background_tasks(): """停止后台任务(手动调用)""" await background_task_manager.stop_all_tasks() def get_task_manager() -> BackgroundTaskManager: """获取后台任务管理器实例""" return background_task_manager