2015년 12월 9일 수요일

Task Scheduling

1. The Spring TaskScheduler abstraction
TaskScheduler 는 미래의 어떠한 시점에서의 task 스케쥴링을 위하여 다양한 메서드를 제공한다.

public interface TaskScheduler {

    ScheduledFuture schedule(Runnable task, Trigger trigger);

    ScheduledFuture schedule(Runnable task, Date startTime);

    ScheduledFuture scheduleAtFixedRate(Runnable task, Date startTime, long period);

    ScheduledFuture scheduleAtFixedRate(Runnable task, long period);

    ScheduledFuture scheduleWithFixedDelay(Runnable task, Date startTime, long delay);

    ScheduledFuture scheduleWithFixedDelay(Runnable task, long delay);

}

가장 간단한 메서드인 'schedule' 은 Runnable과 Date만 가지고 있다. 이것은 특정한 시간 이후에 task가 실행되게할
것이다. 이 메서드 이외에 다른 메서드들은 반복적인 Task 스케쥴링이 가능하다. fixed-rate와 fixed-delay 함수는 간단하지만,
실행하게 하는 Trigger는 보다 유연하다.


2. the Trigger interface

Trigger는 JSR-236으로부터 영감을 받았고, 스프링 3.0에서는 공식적으로 구현되지않았다. Trigger의 기본적인 아이디어는 실행시간은
과거의 실행 결과 혹은 임의적인 상태에 따라 결정된다는 것이다. 만약 이러한 결정이 과거의 실행 결과에 의존한다면, 그 정보는
TriggerContext 안에서 이용 가능하다. Trigger 인터페이스 자체는 매우 간단하다.

public interface Trigger {

    Date nextExecutionTime(TriggerContext triggerContext);

}

TriggerContext 은 가장 중요한 부분이다. 이것은 관련된 모든 데이터를 가지고 있다. 그리고 미래에 필요할 경우, 확장할 수 있다.
TriggerContext 는 인터페이스이다. (SimpleTriggerContext 구현체가 기본적으로 사용된다.) 여기는 Trigger 구현체에서 이용가능한 메서드들이 있다.


public interface TriggerContext {

    Date lastScheduledExecutionTime();

    Date lastActualExecutionTime();

    Date lastCompletionTime();

}


3. Trigger implementations

스프링은 두 종류의 Trigger 인터페이스를 제공한다. 가장 흥미있는 것은 CronTrigger 이다. 이 것은 cron 표현식에 의해서 task를 스케쥴링할 수 있다.
예를 들어, 아래 Task는 월요일부터 금요일까지 매일 9~17시까지 매 시각의 15분마다 task를 실행하게 되어 있다.

scheduler.schedule(task, new CronTrigger("0 15 9-17 * * MON-FRI"));

또 다른 하나는 PeriodicTrigger 이다. 이것은 고정된 시간 주기를 제공하고, 선택적으로 초반의 지연시간을 제공한다. 그리고 시간 주기가 fixed-rate나
fixed-delay로 번역되어야 하는지 boolean 값으로 정할 수 있다. TaskScheduler 인터페이스에서 이미 fixed-rate 나 fixed-delay로 스케쥴링을 위한 메서드가 정의되어
있으므로, 가능할 때마다 이런 메서드는 사용되어야한다. PeriodicTrigger 구현체의 value들은 Trigger 의 추상객체에 따라 컴포넌트 안에서 사용되어질 수 있다.
예를 들어, 주기적인 Trigger, cron에 의한 Trigger, 사용자에 의해 customizing된 Trigger를 상호 교환하면서 사용하는 것은 편할 것이다. component에 사용하기에는 Trigger 를 외부에서
설정할 수 있도록 하는것이 확장하거나 수정할 때 쉬울 것이다.


4. Enable scheduling annotations

@Scheduled 어노테이션을 지원하기 위해서는 @Configuration 클래스에서 @EnableScheduling 을 선언해주어야 한다.

@Configuration
@EnableAsync
@EnableScheduling
public class AppConfig {
}


5. The @Scheduled Annotation

@Scheduled 어노테이션은 trigger metadata와 함께 메서드에 추가될 수 있다. 예를 들어, 아래의 메서드는 고정된 지연시간과 함께 5초마다 수행될 것이다.
즉, 이전 수행의 완료 시간부터 5초 이후에 수행이 될 것이다.

@Scheduled(fixedDelay=5000)
public void doSomething() {
    // something that should execute periodically
}

만약 고정된 비율을 원한다면 간단히 아래처럼 어노테이션을 교체할 수 있다. @FixedRate 어노테이션은 이전 수행의 시작시간 기준으로 시간을 재어,
5초마다 수행될 것이다.

@Scheduled(fixedRate=5000)
public void doSomething() {
    // something that should execute periodically
}

가장 처음 수행 시작 전 지연시간을 주기위해, 아래와 같이 설정할 수도 있다.

@Scheduled(initialDelay=1000, fixedRate=5000)
public void doSomething() {
    // something that should execute periodically
}

아래와 같이 월~금요일까지 5초마다 수행될 수 있게, cron 표현식으로 선언할 수도 있다. 또한 @Scheduled 어노테이션 내의
zone 속성을 선언하여 time zone을 설정할 수도 있다.

@Scheduled(cron="*/5 * * * * MON-FRI")
public void doSomething() {
    // something that should execute on weekdays only
}

이런 메서드는 void 리턴 타입이어야하고, 어떠한 인자도 받아서는 안된다. 만약 이 메서드가 Application Context 내의 다른 객체와 상호작용하여야 한다면,
일반적으로 dependency injection을 통해 이루어질 수 있다.




원본 출처 : http://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html

댓글 없음 :

댓글 쓰기