""" 스케줄러 엔트리포인트 APScheduler를 사용하여 jobs/ 에 등록된 잡들을 주기적으로 실행합니다. """ import asyncio import logging import time from apscheduler.schedulers.asyncio import AsyncIOScheduler from config import settings, TIMEZONE from jobs import JOBS # 로그 타임스탬프를 KST로 출력 logging.Formatter.converter = lambda *args: __import__("datetime").datetime.now(TIMEZONE).timetuple() logging.basicConfig( level=logging.INFO, format="[%(asctime)s KST] [%(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())