일정 시간 간격 또는 정해진 시간에 실행되도록 하는 기능이다.
기본예제코드
스케줄러 클래스.
클래스에 @Component를 달고 메서드에는 @Scheduled를 단다.
비동기로 실행되어야 하는 업무는 @Async를 단다.
@Component
public class ExampleScheduler {
/**
* 생성자.
*/
public ExampleScheduler() {
super();
}
/**
* 스케줄 테스트하기.
*/
@Scheduled(cron = "0/60 * * * * ?")
public void testCron() {
System.out.println("(cron = \"0/60 * * * * ?\") 시스템 시간을 기준으로 1분 마다 주기적으로 실행한다.");
}
/**
* 스케줄 테스트하기.
*/
@Scheduled(fixedRate = 8000)
public void testFixedRate() {
System.out.println("(fixedRate = 8000) 다른 스케줄 작업 완료 여부와 상관 없이 8000ms마다 실행한다.(단, 스케줄러풀 필요.)");
}
@Scheduled(fixedDelay = 2000)
public void testFixedDelay() {
final String prefix = DateFormatUtils.format(new Date(), "ddHHmmss");
for (int i = 0; i < 10; i++) {
System.out.println(prefix + "-" + i + ". 비동기가 제대로 작동하는지 확인하기 위해, 의도적으로 장시간 실행되도록 함.");
try {
Thread.sleep(1000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("(fixedDelay = 2000) 이 작업이 끝나면, 2000ms 뒤에 다시 실행한다.");
}
/**
* 비동기 스케줄 테스트하기.
*/
@Scheduled(fixedRate = 4000)
@Async
public void testFixedRateAysnc() {
System.out.println("(fixedRate = 4000 @Async) 다른 스케줄 작업 완료 여부와 상관 없이 4000ms마다 실행한다.(단, 스케줄러풀 필요.)");
}
}
“dispatcher-servlet.xml”에 설정들 추가.
루트 beans에 task와 그 스키마 정보를 추가한다.
그리고 task가 인식되도록 어노태이션에서 읽어들이도록 ‘<task:annotation-driven/>’를 추가한다.
<beans xmlns="http://www.springframework.org/schema/beans" …(생략)...
xmlns:task="http://www.springframework.org/schema/task"
…생략…
xsi:schemaLocation="...
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd
">
<!-- 스케줄러 -@Scheduled가 있는 @Component 찾기 -->
<task:annotation-driven scheduler="jobScheduler"/>
<!-- 스케줄러 -@Async를 위한 스케줄러풀 설정 -->
<task:scheduler id="jobScheduler" pool-size="10"/>
…생략…
</beans>
‘<task:annotation-driven/>’의 스케줄러 컴포넌트 스캔 범위도 ‘<context:component-scan>’의 ‘base-package’에 설정한 스캔범위에 들어있어야 함은 동일하니 패키지 경로에 주의하자.
해설
스케줄들은 실행시간이 되어도 다른 스케줄이 실행되는 중이면 끝날 때까지 대기하게 된다. 만약 반드시 정해진 시간에 실행되어야 하는 스케줄이라면 문제 될 것이다. 이를 위해 비동기로 실행시킬 수 있다.
비동기는 스케줄 메서드에 @Async를 붙이면 된다. 단, 그냥 붙이기만 하면 실제로는 비동기로 실행이 되지 않는다. 비동기로 실행시키려면 [스케줄러 풀]이 필요하다.
참고 링크
- ["https://m.blog.naver.com/deeperain/221609802306"] : Spring 태그 기반 설정. 처음에는 이거 따라하는 게 가장 좋음.
- [@Scheduled를 활용한 Spring Scheduler] : @Scheduled 어노태이션 속성별 예제가 좋음.
- ["https://needjarvis.tistory.com/652"]