@Scheduled 스케줄러
설정
@EnableScheduling
을 사용하여 스케쥴링을 사용하는것을 알린다.
@SpringBootApplication
@EnableScheduling
public class ApiApplication {
public static void main(String[] args) {
SpringApplication.run(ApiApplication.class, args);
}
}
SpringBoot 2.0 에서는 auto-configuration으로 스케줄러를 생성해준다.
그러나 이 스케줄러의 경우, 쓰레드풀이 아니기 때문에 많은 작업이 있을 때 효율적이지 못하다.많은 작업이 필요한 경우, 쓰레드 풀을 사용할 수 있도록 설정할 수 있다.
- yml 파일 설정
spring: task: scheduling: pool: size: 8 thread-name-prefix: my-scheduler
이미지
- configuration 설정
@Configuration public class SchedulerConfiguration { @Bean public TaskScheduler poolScheduler() { ThreadPoolTaskScheduler threadpool = new ThreadPoolTaskScheduler(); threadpool.setPoolSize(Runtime.getRuntime().availableProcessors() * 2); threadpool.setThreadNamePrefix("my-scheduler"); return threadpool; } }
- Runtime.getRuntime().availableProcessors() = 4
사용법
- 주기적으로 실행을 요하는 메소드 위에서
@Scheduled
를 사용한다.(빈으로 등록된 클래스의 메소드여야 한다.)
@Scheduled(fixedRateString = "5", initialDelay = 3000)
private void scheduleTest() {
logger.error("hello jeong-pro");
}
- initialDelay : 대기시간
- fixedRateString : 이전 작업이 끝난 시점으로 부터 고정된 시간을 문자열로 설정 (milli seconds 단위)
속성
속성이름 | 설명 |
---|---|
cron | 크론 표현식을 지원, "초 분 시 일 월 주 (년)"으로 표현한다. |
fixedDelay | 이전 작업이 끝난 시점으로 부터 고정된 시간을 설정 (milli seconds 단위) |
fixedDelayString | fixedDelay의 value값을 문자열로 설정 |
fixedRate | 이전 작업이 수행되기 시작한 시점으로 부터 고정된 시간을 설정 (milli seconds 단위) |
fixedRateString | fixedRate의 value값을 문자열로 설정 |
initialDelay | 스케줄러에서 메소드가 등록되자마자 수행하는것이 아닌 초기 지연시간을 설정 |
initialDelayString | initialDelay의 value값을 문자열로 설정 |
zone | cron 표현식을 사용햇을 때 사용할 time zone, default = 서버의 time zone |
cron 표현식
필드명 값의 허용 범위 허용된 특수분자 초 0 ~ 59 , - * / 분 0 ~ 59 , - * / 시 0 ~ 23 , - * / 일 1 ~ 31 , - * / ? L W 월 1 ~ 12 or JAN ~ DEC , - * / 요일 1 ~ 7 or SUN ~ SAT , - * / ? L # 연도 empty or 1970 ~ 2099 , - * /
* : 모든값
? : 특정한 값이 없음
- : 범위 (ex> MON-WED)
, : 특별한 값일 때만 동작
/ : 시작시간/단위 (ex> 0/5 매 5분)
L : 일에서 사용하면 마지막 일, 요일에서는 마지막 요일 (토요일)
W : 가장 가까운 평일 (ex> 15W 15일에서 가장 가까운 평일)
# : 몇째주의 무슨 요일을 표현, 요일#주 (ex> 4#2 2번째주 수요일 )
fixedDelay vs fixedRate
zone : timezone 설정가능
```java
@Scheduled(cron = "0 5 0 * * ?", zone = "Asia/Seoul")
private void scheduleTest() {
logger.error("hello jeong-pro");
}
#### 커스터마이징
1. ThreadPoolTaskScheduler를 상속받는 클래스를 생성

- 커스터마이징을 원하는 메소드를 오버라이드 한다.
- 상기 예제는 fixedRate가 0이면 아무일도 일어나지 않도록 커스터마이징
본래는 fixedRate가 0이면 exception 발생
2. 생성한 커스터마이징 클래스를 사용하도록 설정한다.

#### 외부설정으로 주기 설정
- yml, properties파일에 정의한 값으로 적용가능하다.
java
@Scheduled(fixedRateString = "${myscheduler.period}", initialDelay = 2000)
private void scheduleTest() {
logger.error("hello jeong-pro");
}
```