REF: https://www.baeldung.com/spring-scheduled-tasks
@Configuration
@EnableScheduling
public class SpringConfig {
...
}
@Scheduled(fixedDelay = 1000)
public void scheduleFixedDelayTask() {
System.out.println(
"Fixed delay task - " + System.currentTimeMillis() / 1000);
}
@Scheduled(fixedRate = 1000)
public void scheduleFixedRateTask() {
System.out.println(
"Fixed rate task - " + System.currentTimeMillis() / 1000);
}
Fixed rate는 각 작업이 독립적인 경우 사용
기본적으로 작업이 끝나지 않으면 다음작업이 실행되지 않음. 병렬 실행 X
@EnableAsync
public class ScheduledFixedRateExample {
@Async
@Scheduled(fixedRate = 1000)
public void scheduleFixedRateTaskAsync() throws InterruptedException {
System.out.println(
"Fixed rate task async - " + System.currentTimeMillis() / 1000);
Thread.sleep(2000);
}
}
Fixed Rate vs Fixed Delay
Fixed Delay는 Task 실행 완료 시간과 다음 Task 실행 시작 시간 사이의 n 밀리초의 조건 검사
Fixed Rate는 매 n 밀리 초마다 예약된 작업 실행
Job 마다 모든 실행이 독립적인 경우
메모리와 스레드 풀의 크기를 초과하지 않을 것으로 예상되는 경우
작업이 계속 쌓이다보면 Out of Memory exception 발생 가능성이 있음
Initial Delay
초기 initialDelay 이후 작업 수행되며 그 후 fixeddelay로 작업이 실행됨, initilizing 시간이 필요한 경우 유용
@Scheduled(fixedDelay = 1000, initialDelay = 1000)
public void scheduleFixedRateWithInitialDelayTask() {
long now = System.currentTimeMillis() / 1000;
System.out.println(
"Fixed rate task with one second initial delay - " + now);
}
@Scheduled(cron = "0 15 10 15 * ?")
public void scheduleTaskUsingCronExpression() {
long now = System.currentTimeMillis() / 1000;
System.out.println(
"schedule tasks using cron jobs - " + now);
}
Parameterizing the Schedule
외부 Spring expressions를 사용한 설정파일로 파라미터 주입가능
A fixedDelay task: @Scheduled(fixedDelayString = "${fixedDelay.in.milliseconds}")
A fixedRate task: @Scheduled(fixedRateString = "${fixedRate.in.milliseconds}")
A cron expression based task: @Scheduled(cron = "${cron.expression}")
XML을 이용한 설정
<!-- Configure the scheduler -->
<task:scheduler id="myScheduler" pool-size="10" />
<!-- Configure parameters -->
<task:scheduled-tasks scheduler="myScheduler">
<task:scheduled ref="beanA" method="methodA"
fixed-delay="5000" initial-delay="1000" />
<task:scheduled ref="beanB" method="methodB"
fixed-rate="5000" />
<task:scheduled ref="beanC" method="methodC"
cron="*/5 * * * * MON-FRI" />
</task:scheduled-tasks>