57 lines
1.5 KiB
Python
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())
|