[Spring] @Scheduled
@Scheduled는 Spring 3.1 이상부터 지원합니다.
1.Annotation 사용 방법
2.XML 사용 방법
이 글에서는 1.Annotation 사용 방법만 다루고 있습니다. 참고 바랍니다.
Annotation 설정
@Scheduled
개념
주기적인 작업이 있을 때 @Scheduled 애노테이션을 사용하면 쉽게 적용할 수 있다.
Linux를 조금 배우신 분들이라면 Linux의 crontab이라고 생각하면 됩니다.
사용 이유
특정시간 혹은 몇분 혹은 몇시간마다 동작해는 스케쥴러를 구현
주기적인 작업이 필요 할 때
문법
먼저 새로운 기술은 항상 그렇듯 XML 설정을 해줘야 한다.
새로운 XML를 만들거나 기존에 쓰던 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>
</task:annotation-driven>
</beans>
2.기존 XML에 추가하는 방법
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemalocation="
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.0.xsd">
<task:annotation-driven>
</task:annotation-driven>
사용 예시
@Scheduled(fixedDelay=1000)
public void testScheduler(){
System.out.println("스케줄링 테스트");
}
메소드 위에 @Scheduled 어노테이션을 붙여주면 끝이다.
cron은 CronTab에서의 설정과 같이 cron="0/10 * * * * ?" 과 같은 설정이 가능하고
fixedDelay은 이전에 실행된 Task의 종료시간으로 부터 정의된 시간만큼 지난 후 Task를 실행한다.
fixedRate은 이전에 실행된 Task의 시작시간으로 부터 정의된 시간만큼 지난 후 Task를 실행한다.
fixedDelay와 fixedRate의 시간 단위는 밀리세컨드이다.
cron="0/10 * * * * ?" (리눅스 crontab 과 같은 설정방법)
이 람다식을 처음 마주한거같은 느낌은 뭘까?
cron에 대해서 알아보자
-초 0-59 , - * /
-분 0-59 , - * /
-시 0-23 , - * /
-일 1-31 , - * ? / L W
-월 1-12 or JAN-DEC , - * /
-요일 1-7 or SUN-SAT , - * ? / L # (1:일, 2:월, 3:화, 4:수, 5:목, 6:금, 7:토)
-년(옵션) 1970-2099 , - * /
* : 모든 값
? : 특정 값 없음
- : 범위 지정에 사용
, : 여러 값 지정 구분에 사용
/ : 초기값과 증가치 설정에 사용
L : 지정할 수 있는 범위의 마지막 값
W : 월~금요일 또는 가장 가까운 월/금요일
# : 몇 번째 무슨 요일 2#1 => 첫 번째 월요일
크론 표현식에서는 6~7 자리 가 사용됩니다.
cron = "* * * * * *"
왼쪽부터 작은 단위 [초 분 시 일 월 요일 년(생략가능)]
왼쪽부터 작은 단위 [초 분 시 일 월 요일 년(생략가능)]
왼쪽부터 작은 단위 [초 분 시 일 월 요일 년(생략가능)]
몇 가지 예시
[매일 오후 1시에 실행할 cron 만들기]
자 일단 0초 0분이죠
@Scheduled(cron="0 0")
오후 1시래요 24시 표기법이니까
@Scheduled(cron="0 0 13")
매일
@Scheduled(cron="0 0 13 * * ?")
[매 주 금요일 새벽5시 30분 실행할 cron 만들기]
0초 30분 새벽 5시
@Scheduled(cron="0 30 05 ")
매주 금요일
@Scheduled(cron="0 30 05 * FRI ?")
더 자세한 문법 예시는 밑에
수많은 문법 예시
//1초 마다 실행
@Scheduled(fixedDelay=1000)
public void testScheduler(){
System.out.println("스케줄링 테스트");
}
//5초 마다 실행
@Scheduled(fixedDelay=5000)
public void testScheduler(){
System.out.println("스케줄링 테스트");
}
//10초 마다 실행
@Scheduled(fixedDelay=10000)
public void testScheduler(){
System.out.println("스케줄링 테스트");
}
//매일 5시에 실행
@Scheduled(cron="0 0 05 * * ?")
public void testScheduler(){
System.out.println("스케줄링 테스트");
}
//매월 2일,20일 새벽2시에 실행
@Scheduled(cron="0 0 02 2,20 * ?")
public void testScheduler(){
System.out.println("스케줄링 테스트");
}
//매월 마지막날 저녁 10시에 실행
@Scheduled(cron = "0 0 10 L * ?")
public void testScheduler(){
System.out.println("스케줄링 테스트");
}
//1시간 마다 실행 ex) 01:00, 02:00, 03:00....
@Scheduled(cron = "0 0 0/1 * * *")
public void testScheduler(){
System.out.println("스케줄링 테스트");
}
//매일 오후 18시마다 실행 ex) 18:00
@Scheduled(cron = "0 0 18 * * *")
public void testScheduler(){
System.out.println("스케줄링 테스트");
}
//매일 오후 18시00분-18시55분 사이에 5분 간격으로 실행
@Scheduled(cron = "0 0/5 18 * * *")
public void testScheduler(){
System.out.println("스케줄링 테스트");
}
//매일 오후 9시00분-9시55분, 18시00분-18시55분 사이에 5분 간격으로 실행
@Scheduled(cron = "0 0/5 9,18 * * *")
public void testScheduler(){
System.out.println("스케줄링 테스트");
}
//매일 오후 9시00분-18시55분 사이에 5분 간격으로 실행
@Scheduled(cron = "0 0/5 9-18 * * *")
public void testScheduler(){
System.out.println("스케줄링 테스트");
}
//매달 1일 00시에 실행
@Scheduled(cron = "0 0 0 1 * *")
public void testScheduler(){
System.out.println("스케줄링 테스트");
}
//매년 3월내 월-금요일 10시 30분에만 실행
@Scheduled(cron = "0 30 10 ? 3 MON-FRI")
public void testScheduler(){
System.out.println("스케줄링 테스트");
}
여기서 잠깐!
스케줄 돌릴 메소드에 리턴타입과 매개변수를 줄 수 없다.
더 디테일한 설정들
cron : cron 표현식을 지원한다. "초 분 시 일 월 주 (년)"으로 표현한다. cron 표현식에 쓸 수 있는 것들(특수문자 활용 포함)이 많은데
fixedDelay : milliseconds 단위로, 이전 작업이 끝난 시점으로 부터 고정된 시간을 설정한다.
@Scheduled(fixedDelay=5000)
public void testScheduler(){
System.out.println("스케줄링 테스트");
}
fixedDelayString : fixedDelay와 같은데 property의 value만 문자열로 넣는 것이다.
@Scheduled(fixedDelay="5000")
public void testScheduler(){
System.out.println("스케줄링 테스트");
}
fixedRate : milliseconds 단위로, 이전 작업이 수행되기 시작한 시점으로 부터 고정된 시간을 설정한다.
@Scheduled(fixedRate = 3000)
public void testScheduler(){
System.out.println("스케줄링 테스트");
}
fixedRateString : fixedDelay와 같은데 property의 value만 문자열로 넣는 것이다.
@Scheduled(fixedRate = "3000")
public void testScheduler(){
System.out.println("스케줄링 테스트");
}
initialDelay : 스케줄러에서 메서드가 등록되자마자 수행하는 것이 아닌 초기 지연시간을 설정하는 것이다.
@Scheduled(fixedDelay = 3000,initialDelay = 1000)
public void testScheduler(){
System.out.println("스케줄링 테스트");
}
initialDelayString : 위와 마찬가지로 문자열로 값을 표현하겠다는 의미다.
@Scheduled(fixedDelay = 3000,initialDelay = "1000")
public void testScheduler(){
System.out.println("스케줄링 테스트");
}
zone : cron표현식을 사용했을 때 사용할 time zone으로 따로 설정하지 않으면 기본적으로 서버의 time zone이다.
다음은 동적으로 스케줄러를 멈추고 시간주기를 바꾸는 법에 대해 포스팅 하겠습니다.
'Spring' 카테고리의 다른 글
[Spring] GET 파라미터(parameter) 데이터 받기 총 정리 (0) | 2019.12.15 |
---|---|
[Spring] MyBatis 데이터 HashMap으로 받기 (0) | 2019.10.31 |
[Spring] DTO(Data Transfer Object)와 VO(Value Object) (1) | 2019.10.29 |
[Spring] GET과 POST의 차이점과 문법 정리 (0) | 2019.10.21 |
[Spring] annotations 정리 (0) | 2019.10.16 |