홈 › 실무 확장 › 09 / 22

@Scheduled 운영

fixedRate·fixedDelay·cron, 예외·겹침·다중 인스턴스·종료
섹션 7진행 0 / 22

7. 정리

  • @Scheduled 는 ScheduledAnnotationBeanPostProcessor 가 TaskScheduler 에 등록하는 얇은 층이고, TaskScheduler 는 결국 JDK ScheduledExecutorService 위에 있습니다.
  • 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 를 먼저 검토하는 편이 낫습니다.