7. 정리
@Scheduled는ScheduledAnnotationBeanPostProcessor가TaskScheduler에 등록하는 얇은 층이고,TaskScheduler는 결국 JDKScheduledExecutorService위에 있습니다.fixedRate는 시작 기준,fixedDelay는 종료 기준입니다. 작업이 길어지면fixedRate는 밀린 회차를 몰아서 실행하니, 부하 제어가 중요하면fixedDelay가 안전합니다.- SES 는 작업이 예외를 던지면 그 스케줄을 조용히 영구 정지시킵니다.
try/catch(Throwable)/finally로 감싸고 실패를 로그로 남겨야 스케줄이 살아남습니다. - 기본 스레드 풀은 1개입니다. 배치가 늘어나면 풀 크기를 "동시 실행 배치 수 + 1" 로 늘려야 서로 밀어내지 않습니다.
- 겹침은 프로세스 안에서는
AtomicBoolean으로, 인스턴스 여러 대에서는 파일 잠금·DB 행 잠금·ShedLock·Quartz 클러스터 같은 프로세스를 넘는 잠금으로 막습니다. - cron 은 6필드(초 분 시 일 월 요일)이고,
zone을 명시하지 않으면 서버 시간대를 따라가 컨테이너가 UTC 일 때 사고가 납니다. - 종료는
shutdown()으로 새 회차를 막고awaitTermination으로 진행 중 작업을 기다린 뒤에만shutdownNow()를 씁니다. 실행 이력을 남겨 두면 "배치가 멈췄는지" 를 알림으로 잡을 수 있습니다. - 이 레슨의
SafeTask·LeaderLock은 Spring Boot 의ThreadPoolTaskScheduler·ErrorHandler·ShedLock·Quartz 클러스터로 그대로 이어집니다. 규모가 커지면 자체 잠금 코드보다 ShedLock 이나 Quartz 를 먼저 검토하는 편이 낫습니다.