Closed wooyounggggg closed 2 years ago
특정 시간에 정기적으로 수행해야 하는 비즈니스 작업
작업 스케줄링에 등장하는 3가지 요소가 있습니다. 작업, 트리거, 그리고 스케줄러입니다.
스케줄에 맞추어 실행되는 비즈니스 로직입니다.
스프링에서 작업은 메서드로 정의됩니다.
작업은 일정한 시간 간격을 갖고 실행되어야 합니다. 작업의 실행 간격을 관장하는 정책이 트리거입니다.
아래 두 가지는 대표적인 트리거 유형입니다.
1)고정 간격을 지키며 실행
2)cron 표현식에 맞추어 실행
스프링은 Trigger
인터페이스 및 구현체 PeriodicTigger
, CronTrigger
클래스를 제공합니다!
스케줄러는 작업을 트리거에 맞추어 실행하되 고유의 실행 전략을 갖습니다.
1) 타이머를 사용한 스케줄링
TimerManagerTaskScheduler
는 commonj.timers.TimerManager
를 래핑한 클래스입니다.
Deprecated입니다.
2) 공유 스레드 풀에서 예약 작업을 실행
ConcurrentTaskScheduler
와 ThreadPoolTaskScheduler
는 java.util.concurrent.ScheduledThreadPoolExecutor
를 래핑한 클래스입니다.
이 네임스페이스 하위 태그를 사용하여
<beans
...
xmlns:task="http://www.springframework.org/shema/task"
xsi:schemaLocation=..
http://www.springframework.org/schema/task/spring-task.xsd" />
<task:scheduler id="스케줄러 빈 아이디" pool-size="스레드 풀 사이즈(정수)" />
ThreaedPoolTaskScheduler
스케줄러 빈을 등록합니다.
ScheduledThreadPoolExecutor
가 이용하는 스레드 풀 크기입니다.작업 스케줄러가 담당할 작업들을 열거합니다.
메서드를 예약 작업으로 정의합니다. 트리거 정책도 설정합니다.
<task:scheduled-tasks schduler="스케줄러 빈 참조">
<task:scheduled ref="서비스 빈 참조" method="메서드명" fixed-delay="10000" />
</task:scheduled-tasks>
@EnableScheduling
Config 클래스에 붙여주면, 스프링은 작업 스케줄러 빈을 색인합니다.
TaskScheduler
혹은 ScheduledExecutorService
타입으로 유일한 빈taskScheulder
로 식별되는 빈이제 우리가 할 일은 예약 작업에 어노테이션을 붙여 주는 것 뿐입니다.
@Scheduled
어노테이션예약 작업인 메서드에 붙여주는 어노테이션입니다. <task:scheduled>
태그 용법을 준용하면 됩니다.
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(Schedules.class)
public @interface Scheduled {
String CRON_DISABLED = "-";
String cron() default "";
String zone() default "";
long fixedDelay() default -1;
String fixedDelayString() default "";
long fixedRate() default -1;
String fixedRateString() default "";
long initialDelay() default -1;
String initialDelayString() default "";
}
ThreadPoolTaskScheduler
를 기본적인 스케줄러로 활용하는 것 같습니다.@EnableAsync
Config 클래스에 @EnableAsync
를 붙이면 비동기 작업 설정이 가능해집니다.
메서드에 @Async
어노테이션이 붙은 메서드는 비동기 실행됩니다.
비동기 작업의 반환으로 Future<V>
타입을 내놓을 수 있습니다.
연산된 값을 얻으려면 퓨처의 get()
을 호출하고 실제 값이 가용할 때까지 대기합니다.
public class AsyncService {
@Async
public void asyncTask() {..}
@Async
public Funture<String> asyncTaskWIthReturn() {..}
}
public class Application {
public static void main(String... args) {
AsyncService service = ctx.getBean(AsyncService.class);
service.asyncTask();
Future<String> result = service.asyncTaskWithReturn();
String actualResult = result.get();
}
}
앞서 살펴본 스프링 작업 스케줄링은 TaskScheulder
빈이, @Scheduled
작업들을 주기적으로 실행해 주는 기능이었습니다.
이와 달리, 작업을 단순히 한 번 실행하되 스레드 정책을 적용하고 싶다면 TaskExecutor
를 사용합니다.
작업 실행자는 Runnable
구현체를 실행합니다. 결국 Task
는 람다식으로 간단히 표현할 수 있습니다.
TaskExecutor taskExecutor = ctx.getBean(TaskExecutor.class);
taskExecutor.executeTask(()-> System.out.println("Task executed"));
주제
11장 태스크 스케줄링을 읽고 중요✨ 하다고 생각하는 키워드와 선택한 이유에 대해서 코멘트로 달아주세요.
연관 챕터
78