작업중에 주기적으로 DB를 백업하거나 특정시간 혹은 몇분 혹은 몇시간마다 동작하여 외부 시스템에 접속하여 데이터를 가져오는 등의 경우에 crontab과 같이 동작하는 프로그램을 스프링으로 구현할 수있다.
Spring에 Timer나 Quartz가 있지만, Task Scheduler 사용방법을 알아보도록 하겠다.
스프링 3.0부터 TaskExecutor와 TaskScheduler 인스턴스를 구성하는 XML 네임스페이스가 존재하고 트리거로 예약된 태스크를 구성하는 간편한 방법도 제공한다.
1. xml 설정
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.0.xsd">
<task:annotation-driven />
</beans>
2. scheduler
스프링 task 네임스페이스에서 가장 강력한 기능은 스프링 애플리케이션 컨텍스트에서 스케줄링 되는 태스크를 설정하는 기능이다. 기본적으로 "ref" 속성은 스프링이 관리하는 어떤 객체라도 가리킬 수 있고 "method" 속성은 해당 객체에서 호출될 메서드명을 지정한다.
<task:scheduled-tasks scheduler="myScheduler">
<task:scheduled ref="someObject" method="someMethod" fixed-rate="5000"/>
<task:scheduled ref="anotherObject" method="anotherMethod" cron="*/5 * * * * MON-FRI"/>
</task:scheduled-tasks>
<task:scheduler id="myScheduler" pool-size="10"/>
<bean id="someObject" class="someMethod" />
<bean id="anotherObject" class="anotherMethod" />
예제에서 보듯이 외부 요소가 schedule를 참조하고 각 task는 트리거 메타데이터의 설정을 가지고 있다. 메타데이터는 고정된 지연시간을 가진 주기적인 트리거를 설정하거나(fixed-rate) "cron"속성을 사용해서 더 세밀하게 제어할 수도 있다.
표현 |
의미 |
fixed-delay |
이전에 실행된 task의 종료시간으로부터 정의된 시간만큼 지난 후 다음 task를 실행 (밀리세컨드 단위) |
fixed-rate |
이전에 실행된 task의 시작 시간으로부터 정의된 시간만큼 지난 후 다음 task를 실행 (밀리세컨드 단위) |
3.Cron Expression
"초 분 시 일 월 요일"
"*" 표시는 항상/모두 를 의미하는 expression이다.
seconds에서 사용하면 매초, minutes에서 사용하면 매분, hours에서 사용하면 매시간을 의미한다.
"/" 표시는 시작시간과 반복 간격 설정을 의미한다.
seconds위치에 0/15로 설정하면 0초에 시작해서 15초 간격으로 동작, minutes위치에 5/10으로 설정하면 5분에 시작해서 10분 간격으로 동작한다.
순서 |
필드명 |
사용 가능한 값 |
1 |
seconds |
0~59 , - * / |
2 |
minutes |
0~59 , - * / |
3 |
hours |
0~23 , - * / |
4 |
day of month |
1~31 , - * ? / L W |
5 |
month |
1~12 or JAN-DEC , - * / |
6 |
day of week |
1-7 or SUN-SAT , - * ? / L # |
7 |
years (optional) |
1970~2099 , - * / |
ex)
표현식 |
의미 |
0 0 12 * * * |
매일 12시에 실행 |
0 15 10 * * * |
매일 10시 15분에 실행 |
0 * 14 * * * |
매일 14시에 0분~59분까지 매분 실행 |
0 0/5 14 * * * |
매일 14시에 시작해서 5분 간격으로 실행 |
0 0/5 14,18 * * * |
매일 14시, 18시에 시작해서 5분 간격으로 실행 |
0 0-5 14 * * * |
매일 14시에 0분, 1분, 2분, 3분, 4분, 5분에 실행 |
0 0 20 ? * MON-FRI |
월~금일 20시 0분 0초에 실행 |
0 0/5 14 * * ? |
아무요일, 매월, 매일 14:00부터 14:05분까지 매분 0초 실행 (6번 실행됨) |
0 15 10 ? * 6L |
매월 마지막 금요일 아무날이나 10:15:00에 실행 |
0 15 10 15 * ? |
아무요일, 매월 15일 10:15:00에 실행 |
* /1 * * * * |
매 1분마다 실행 |
* /10 * * * * |
매 10분마다 실행 |
Reference
https://blog.outsider.ne.kr/1066
https://javafactory.tistory.com/1386
http://webprogramer.kr/blog/P000000289/post.do
'SPRING' 카테고리의 다른 글
[SPRING] ResponseEntity (1) | 2019.07.05 |
---|---|
[SPRING] RestTemplate (0) | 2019.07.04 |
[SPRING] Tomcat JNDI 설정 (0) | 2019.06.16 |
[SPRING] 파일업로드 (0) | 2019.03.06 |
댓글