from apscheduler.schedulers.background import BackgroundScheduler from sqlalchemy.orm import Session from app.agent.runner import AgentRunner from app.core.config import Settings from app.db.session import SessionLocal def run_scheduled_job(settings: Settings) -> None: # 定时任务不在请求生命周期内,需要自己创建和关闭数据库会话。 db: Session = SessionLocal() try: AgentRunner(db=db, settings=settings).run_daily() finally: db.close() def build_scheduler(settings: Settings) -> BackgroundScheduler: # 调度器始终可供手动任务复用,自动采集关闭时不注册任何周期任务。 scheduler = BackgroundScheduler(timezone=settings.agent_timezone) if not settings.agent_enabled: return scheduler # APScheduler负责按固定间隔自动运行,避免服务重启时连续触发外部采集限流。 scheduler.add_job( run_scheduled_job, trigger="interval", minutes=settings.agent_interval_minutes, args=[settings], id="continuous-intelligence", replace_existing=True, max_instances=1, coalesce=True, ) return scheduler