Spring TaskScheduler
1. Spring TaskScheduler
- Spring은 미래의 특정 시점에 실행할 작업을 예약하기 위한 다양한 메서드가 있는 TaskScheduler SPI를 제공합니다.
- Spring의 TaskScheduler는 Java 애플리케이션에서 작업 스케줄링을 관리하기 위한 추상화 계층을 제공합니다.
- 이러한 추상화로 인해 아래와 같은 이점이 있습니다.
- 애플리케이션 코드와 실제 스레드 관리 방식을 분리
- 다양한 환경(로컬, 서버 등)에 동일한 코드로 배포 가능
- 특히 엔터프라이즈 환경에서 스레드 관리 정책 준수 용이
1.1 TaskScheduler 인터페이스
- 다음은 TaskScheduler 인터페이스 정의입니다
public interface TaskScheduler {
Clock getClock();
ScheduledFuture schedule(Runnable task, Trigger trigger);
ScheduledFuture schedule(Runnable task, Instant startTime);
ScheduledFuture scheduleAtFixedRate(Runnable task, Instant startTime, Duration period);
ScheduledFuture scheduleAtFixedRate(Runnable task, Duration period);
ScheduledFuture scheduleWithFixedDelay(Runnable task, Instant startTime, Duration delay);
ScheduledFuture scheduleWithFixedDelay(Runnable task, Duration delay);
}
- 가장 간단한 메서드는 Runnable과 Instant만 받는 schedule 메서드입니다.
- 이는 지정된 시간 이후에 작업이 한 번 실행되게 합니다.
- 다른 모든 메서드는 작업을 반복적으로 실행하도록 예약할 수 있습니다.
- fixed-rate와 fixed-delay 메서드는 단순한 주기적 실행을 위한 것이지만, Trigger를 받는 메서드는 훨씬 더 유연합니다.
1.2 TaskScheduler 구현체
- DefaultManagedTaskScheduler
- Jakarta EE 환경에서 JSR-236 표준 ManagedScheduledExecutorService에 위임
- ConcurrentTaskScheduler
- 로컬 ScheduledExecutorService를 래핑한 단순한 구현체
- ThreadPoolTaskScheduler
- 가장 일반적으로 사용되는 구현체로, ScheduledExecutorService에 위임하면서 스프링 빈 스타일의 구성 제 공합니다.
- Spring 6.1에서 일시 중지/재개 기능이 추가되었습니다.
- SimpleAsyncTaskScheduler
- JDK 21의 가상 스레드에 최적화된 새로운 구현체
- 단일 스케줄러 스레드를 사용하지만 각 작업마다 별도의 스레드 생성
2. Trigger 인터페이스
- Trigger 인터페이스는 본질적으로 JSR-236에서 영감을 받았습니다.
- Trigger의 기본 아이디어는 실행 시간이 이전 실행 결과 또는 임의 조건에 기반하여 결정될 수 있다는 것입니다.
public interface Trigger {
Instant nextExecution(TriggerContext triggerContext);
}
public interface TriggerContext {
Clock getClock();
Instant lastScheduledExecution();
Instant lastActualExecution();
Instant lastCompletion();
}
- TriggerContext가 가장 중요한 부분입니다. 이는 모든 관련 데이터를 캡슐화하고, 필요한 경우 미래에 확장할 수 있습니다.
- TriggerContext는 인터페이스입니다(기본적으로 SimpleTriggerContext 구현이 사용됨).