1. 개요
이 예제에서는 Spring 작업 스케줄링 메커니즘인 TaskScheduler 와 미리 빌드된 구현에 대해 설명합니다. 그런 다음 사용할 다양한 트리거를 살펴보겠습니다. Spring의 스케줄링에 대해 자세히 알아보려면 @Async 및 @Scheduled 기사를 확인하세요.
Spring 3.0 은 미래의 특정 시점에 실행되도록 설계된 다양한 메서드를 포함하는 TaskScheduler 를 도입했습니다. TaskScheduler 는 ScheduledFuture 인터페이스 의 표현 개체도 반환합니다. 이 개체를 사용하여 예약된 작업을 취소하고 완료 여부를 확인할 수 있습니다.
스케줄링을 위해 실행 가능한 작업을 선택한 다음 적절한 스케줄링 정책을 선택하기만 하면 됩니다.
2. ThreadPoolTaskScheduler
ThreadPoolTaskScheduler 는 작업을 ScheduledExecutorService에 Delegation하고 TaskExecutor 인터페이스 를 구현하므로 내부 스레드 관리에 유용합니다 . 그것의 단일 인스턴스는 @Scheduled 어노테이션 뿐만 아니라 비동기 잠재적 실행을 처리할 수 있습니다 .
ThreadPoolTaskSchedulerConfig 에서 ThreadPoolTaskScheduler 빈을 정의해 보겠습니다 .
@Configuration
@ComponentScan(
basePackages="com.baeldung.taskscheduler",
basePackageClasses={ThreadPoolTaskSchedulerExamples.class})
public class ThreadPoolTaskSchedulerConfig {
@Bean
public ThreadPoolTaskScheduler threadPoolTaskScheduler(){
ThreadPoolTaskScheduler threadPoolTaskScheduler
= new ThreadPoolTaskScheduler();
threadPoolTaskScheduler.setPoolSize(5);
threadPoolTaskScheduler.setThreadNamePrefix(
"ThreadPoolTaskScheduler");
return threadPoolTaskScheduler;
}
}
구성된 bean threadPoolTaskScheduler 는 구성된 풀 크기 5를 기준으로 작업을 비동기적으로 실행할 수 있습니다.
모든 ThreadPoolTaskScheduler 관련 스레드 이름에는 ThreadPoolTaskScheduler 접두사가 붙습니다 .
그런 다음 예약할 수 있는 간단한 작업을 구현해 보겠습니다.
class RunnableTask implements Runnable{
private String message;
public RunnableTask(String message){
this.message = message;
}
@Override
public void run() {
System.out.println(new Date()+" Runnable Task with "+message
+" on thread "+Thread.currentThread().getName());
}
}
이제 이 작업을 실행하도록 스케줄러를 예약할 수 있습니다.
taskScheduler.schedule(
new Runnabletask("Specific time, 3 Seconds from now"),
new Date(System.currentTimeMillis + 3000)
);
taskScheduler 는 현재 시간으로부터 정확히 3초 후인 알려진 날짜에 이 실행 가능한 작업을 예약합니다.
이제 ThreadPoolTaskScheduler 스케줄링 메커니즘에 대해 좀 더 자세히 살펴보겠습니다.
3. 고정 지연으로 실행 가능한 작업 예약
두 가지 간단한 메커니즘으로 고정 지연을 예약할 수 있습니다.
3.1. 마지막으로 예약된 실행의 고정 지연 후 예약
1000밀리초의 고정 지연 후에 실행되도록 작업을 구성해 보겠습니다.
taskScheduler.scheduleWithFixedDelay(
new RunnableTask("Fixed 1 second Delay"), 1000);
RunnableTask 는 하나 의 실행 완료와 다음 실행 시작 사이에 항상 1000밀리초 후에 실행됩니다.
3.2. 특정 날짜의 고정 지연 후 스케줄링
지정된 시작 시간의 고정 지연 후에 실행되도록 작업을 구성해 보겠습니다.
taskScheduler.scheduleWithFixedDelay(
new RunnableTask("Current Date Fixed 1 second Delay"),
new Date(),
1000);
RunnableTask 는 @PostConstruct 메서드가 시작 되는 시간을 포함하는 지정된 실행 시간에 호출 되고 이후 1000밀리초 지연됩니다.
4. 고정 비율로 스케줄링
실행 가능한 작업을 고정 속도로 예약하는 두 가지 간단한 메커니즘이 있습니다.
4.1. 고정 속도로 RunnableTask 예약
고정된 밀리초 속도 로 실행되도록 작업을 예약해 보겠습니다 .
taskScheduler.scheduleAtFixedRate(
new RunnableTask("Fixed Rate of 2 seconds") , 2000);
다음 RunnableTask 는 여전히 실행 중일 수 있는 마지막 실행 상태에 관계없이 항상 2000밀리초 후에 실행됩니다.
4.2. 지정된 날짜부터 고정 비율로 RunnableTask 예약
taskScheduler.scheduleAtFixedRate(new RunnableTask(
"Fixed Rate of 2 seconds"), new Date(), 3000);
RunnableTask 는 현재 시간으로부터 3000밀리초 후에 실행됩니다.
5. CronTrigger 로 일정 잡기
CronTrigger 를 사용 하여 cron 표현식을 기반으로 작업을 예약합니다.
CronTrigger cronTrigger
= new CronTrigger("10 * * * * ?");
제공된 트리거를 사용하여 특정 지정된 케이던스 또는 일정에 따라 작업을 실행할 수 있습니다.
taskScheduler.schedule(new RunnableTask("Cron Trigger"), cronTrigger);
이 경우 RunnableTask 는 매분 10초에 실행됩니다.
6. PeriodicTrigger 로 스케줄링
PeriodicTrigger 를 사용 하여 2000밀리초의 고정 지연 으로 작업을 예약해 보겠습니다 .
PeriodicTrigger periodicTrigger
= new PeriodicTrigger(2000, TimeUnit.MICROSECONDS);
구성된 PeriodicTrigger Bean은 2000밀리초의 고정 지연 후 작업을 실행하는 데 사용됩니다.
이제 PeriodicTrigger 를 사용하여 RunnableTask 를 예약해 보겠습니다 .
taskScheduler.schedule(
new RunnableTask("Periodic Trigger"), periodicTrigger);
고정 지연이 아닌 고정 속도로 초기화되도록 PeriodicTrigger 를 구성할 수도 있습니다 . 또한 첫 번째 예약 작업에 대해 주어진 밀리초 단위로 초기 지연을 설정할 수 있습니다.
periodicTrigger 빈 에서 return 문 앞에 두 줄의 코드를 추가하기만 하면 됩니다 .
periodicTrigger.setFixedRate(true);
periodicTrigger.setInitialDelay(1000);
setFixedRate 메서드를 사용 하여 고정 지연이 아닌 고정 속도로 작업을 예약했습니다. 그런 다음 setInitialDelay 메서드를 사용하여 실행 가능한 첫 번째 작업이 실행되도록 초기 지연을 설정했습니다.
7. 결론
이 짧은 기사에서 우리는 작업에 대한 Spring 지원을 사용하여 실행 가능한 작업을 예약하는 방법을 배웠습니다.
고정 지연, 고정 속도 및 지정된 트리거에 따라 작업 실행을 시연했습니다.
항상 그렇듯이 코드는 GitHub 에서 Maven 프로젝트로 사용할 수 있습니다 .