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 프로젝트로 사용할 수 있습니다 .

Generic footer banner