manager.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. from apscheduler.schedulers.asyncio import AsyncIOScheduler
  2. from apscheduler.triggers.cron import CronTrigger
  3. from apscheduler.triggers.interval import IntervalTrigger
  4. from app.core.config import settings
  5. from app.scheduler.jobs import (
  6. demand_pool_daily_strategy_alert_job,
  7. demand_pool_today_incremental_sync_job,
  8. heartbeat_job,
  9. )
  10. # 与 scheduler 一致。APScheduler 3.x 在 add_job 里传入 CronTrigger 实例时,若未显式指定
  11. # timezone,会按 UTC 等默认时区解析 hour/minute,导致「配置的 9:40」实际在 UTC 触发,
  12. # 北京时间观测为 17:40(+8 小时)。
  13. _CRON_TZ = "Asia/Shanghai"
  14. scheduler = AsyncIOScheduler(timezone=_CRON_TZ)
  15. def setup_jobs() -> None:
  16. scheduler.add_job(
  17. heartbeat_job,
  18. trigger=IntervalTrigger(seconds=settings.scheduler_heartbeat_seconds),
  19. id="heartbeat_job",
  20. replace_existing=True,
  21. )
  22. if settings.demand_pool_hourly_sync_enabled:
  23. scheduler.add_job(
  24. demand_pool_today_incremental_sync_job,
  25. trigger=CronTrigger(
  26. minute=settings.demand_pool_hourly_sync_minute,
  27. timezone=_CRON_TZ,
  28. ),
  29. id="demand_pool_hourly_sync_job",
  30. replace_existing=True,
  31. max_instances=1,
  32. coalesce=True,
  33. )
  34. if settings.demand_pool_daily_strategy_alert_enabled:
  35. scheduler.add_job(
  36. demand_pool_daily_strategy_alert_job,
  37. trigger=CronTrigger(
  38. hour=settings.demand_pool_daily_strategy_alert_hour,
  39. minute=settings.demand_pool_daily_strategy_alert_minute,
  40. timezone=_CRON_TZ,
  41. ),
  42. id="demand_pool_daily_strategy_alert_job",
  43. replace_existing=True,
  44. max_instances=1,
  45. coalesce=True,
  46. )
  47. def start_scheduler() -> None:
  48. if scheduler.running:
  49. return
  50. setup_jobs()
  51. scheduler.start()
  52. def shutdown_scheduler() -> None:
  53. if not scheduler.running:
  54. return
  55. scheduler.shutdown(wait=False)