| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- """
- 后台定时任务管理 - 管理端专用
- 密钥过期检查与自动生成已拆至独立工程 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
|