스케줄링이란?
블로그 작성 중 1분마다 자동으로 임시저장 되도록 하는 기능을 구현할 때
매일 특정 시간에 데이터를 갱신해야 하는 기능을 구현할 때
- 서비스가 실행되는 동안 특정 규칙에 따라 작업을 반복적으로 수행하도록 해주는 기능
- 특정 작업을 자동화하고, 수동으로 작업을 수행해야 하는 부담 감소
Spring에서 스케줄링 사용
@Scheduled
public @interface Scheduled {
String CRON_DISABLED = "-";
String cron() default "";
String zone() default "";
long fixedDelay() default -1L;
String fixedDelayString() default "";
long fixedRate() default -1L;
String fixedRateString() default "";
long initialDelay() default -1L;
String initialDelayString() default "";
TimeUnit timeUnit() default TimeUnit.MILLISECONDS;
String scheduler() default "";
}
fixedRate, fixedRateString
- fixedRate : 작업이 일정한 고정 시간 마다 실행되도록 설정
- fixedRateString : fixedRate와 동일한 방식, 환경 변수, SpEL 적용 가능
// 방법 1
// 5000ms = 5초마다 동작함.
@Scheduled(fixedRate = 5000)
// 방법 2
// 5000ms = 5초마다 동작함.
@Scheduled(fixedRateString = "5000")
// 방법 3
// application.properties
task.execution.rate=5000
// application.properties 에 정의된 5000ms = 5초마다 동작함
@Scheduled(fixedRateString = "${task.execution.rate}")
// 방법 4
// task.base.rate 환경변수의 2배로 설정함. = 10000ms = 10초마다 동작함
@Scheduled(fixedRateString = "#{T(Integer).parseInt('${task.base.rate}') * 2}") // baseRate의 두 배로 설정
fixedDelay, fixedDelayString
- fixedDelay : 일정한 지연 시간 후 작업 실행
- fixedDelayString : fixedDelay와 동일한 방식, 환경 변수 적용 가능
// 방법 1
// 이전 작업 완료 이후 5초 후에 동작함.
@Scheduled(fixedDelay = 5000)
// 방법 2
// 이전 작업 완료 이후 5초 후에 동작함.
@Scheduled(fixedDelayString = "5000")
// 방법 3
// application.properties
task.execution.rate=5000
// application.properties 에 정의된 5000ms = 이전 작업 완료 이후 5초 후에 동작함.
@Scheduled(fixedDelayString = "${task.execution.rate}")
// 방법 4
// task.base.rate 환경변수의 2배로 설정함. = 10000ms = 이전 작업 완료 이후 10초 후에 동작함.
@Scheduled(fixedDelayString = "#{T(Integer).parseInt('${task.base.rate}') * 2}") // baseRate의 두 배로 설정
initialDelay, initialDelayString
- initialDelay : 애플리케이션 시작 후 처음 작업 실행 전 지연 시간, fixedRate나 fixedDelay와 함께 사용
- initialDelayString : initialDelay와 동일한 방식, 환경 변수 적용 가능
// 방법 1
// 애플리케이션 실행 후 1초 뒤에 실행됩니다.
@Scheduled(initialDelay = 1000)
// 방법 2
// 애플리케이션 실행 후 1초 뒤, 이후 부터는 이전 작업 완료 이후 5초 후에 동작함.
@Scheduled(initialDelay = 1000, fixedDelay = 5000)
// 방법 3
// 애플리케이션 실행 후 10초 뒤, 이후 부터는 이전 작업 완료 이후 5초 후에 동작함.
@Scheduled(initialDelayString = "10000", fixedRateString = "5000")
// 방법 4
// application.properties
task.execution.initial-rate=5000
task.execution.rate=5000
// application.properties 에 정의된 5000ms = 이전 작업 완료 이후 5초 후에 동작함.
@Scheduled(initialDelayString = "${task.execution.initial-rate}", fixedDelayString = "${task.execution.rate}")
Secheduler
- 기본적으로 스케줄링 작업은 싱글 스레드로 실행
- 멀티 스레드로 처리하거나 특정 스레드 풀에서 스케줄링 작업을 관리하고 싶을 때 사용
@Configuration
public class SchedulerConfig {
@Bean
public ThreadPoolTaskScheduler customTaskScheduler() {
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
taskScheduler.setPoolSize(5); // 스레드 풀의 크기 설정
taskScheduler.setThreadNamePrefix("Custom-Scheduler-"); // 스레드명 Prefix 설정
return taskScheduler;
}
}
@Scheduled(fixedRate = 1000, scheduler = "customTaskScheduler")
public void schedule() {
String name = Thread.currentThread().getName(); // 현재 쓰레드 이름을 가져옴
System.out.println("Scheduled task is running on thread: " + name);
}
cron
- 각 초, 분, 시, 일, 월, 요일 등의 필드를 조합하여 작업 실행 주기 지정
- zone : cron 설정 시 기준이 되는 Timezone 설정
cron = "* * * * * * *"
| | | | | | ------- (Optional) 년도 [1970-2999,*]
| | | | | --------- 요일 [0-7,*,?] = [일:0, 월:1, 화:2 ...]
| | | | ----------- 월 [1-12,*]
| | | ------------- 일 [1-31,*,?]
| | --------------- 시 [0-23,*]
| ----------------- 분 [0-59,*]
------------------- 초 [0-59,*]
항목을 * 로 설정하는 경우는 모든 [초,분,시,일,월,요일,년도]마다 실행 한다고 선언하는 것입니다.
항목을 ? 로 설정하는 것은 [요일,일] 항목만 가능하며 "설정하지 않음" 입니다.
[요일,일] 상호배타적이기 때문에 존재합니다.
- TODO 스케줄링 서비스 분리하기