o2o-castad-scheduler/main.py

54 lines
1.4 KiB
Python

"""
스케줄러 엔트리포인트
APScheduler를 사용하여 jobs/ 에 등록된 잡들을 주기적으로 실행합니다.
"""
import asyncio
import logging
from apscheduler.schedulers.asyncio import AsyncIOScheduler
from config import settings
from jobs import JOBS
logging.basicConfig(
level=logging.INFO,
format="[%(asctime)s] [%(levelname)s] %(name)s - %(message)s",
datefmt="%Y-%m-%d %H:%M:%S",
)
logger = logging.getLogger(__name__)
async def main() -> None:
scheduler = AsyncIOScheduler()
for job in JOBS:
interval = job.interval_minutes or settings.CHECK_INTERVAL_MINUTES
scheduler.add_job(
job.run,
trigger="interval",
minutes=interval,
id=job.name,
name=job.name,
max_instances=1,
)
logger.info(f"[SCHEDULER] 잡 등록 - '{job.name}' (주기: {interval}분)")
scheduler.start()
logger.info(f"[SCHEDULER] 시작 - 백엔드: {settings.BACKEND_INTERNAL_URL}")
# 시작 시 모든 잡 즉시 1회 실행
await asyncio.gather(*[job.run() for job in JOBS])
try:
await asyncio.Event().wait()
except (KeyboardInterrupt, SystemExit):
logger.info("[SCHEDULER] 종료 중...")
scheduler.shutdown()
if __name__ == "__main__":
asyncio.run(main())