o2o-castad-scheduler/main.py

57 lines
1.5 KiB
Python

"""
스케줄러 엔트리포인트
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())