Hello World

@Schedule Spring 스프링 스케쥴 설정법 & CronTab 본문

Spring/3.x

@Schedule Spring 스프링 스케쥴 설정법 & CronTab

EnterKey 2016. 5. 11. 18:13
반응형


********************************************************************************************************
스프링 MVC 에서 
일정 시간 주기적으로 작업하는 스케쥴러를 만들어 본다.
 
일단 root-context.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:util="http://www.springframework.org/schema/util"
 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
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
 <bean id="careerAlarmService" class="kwon.app.profile.AlarmTask" />
 <task:scheduler id="gsScheduler" pool-size="10" />
 <task:executor id="gsTaskExecutor" pool-size="10" />
 <task:annotation-driven executor="gsTaskExecutor"
  scheduler="gsScheduler" />

 <!-- Root Context: defines shared resources visible to all other web components -->
</beans>
 
위 처럼 변경한다.
class는 실제 class파일이 있는 위치 잡아주면 된다.
 
 
원래는
 
 <!-- <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> -->


이것만 적혀 잇엇을거다. 그리고 나선
 
public class AlarmTask {
 
private static final Logger logger = LoggerFactory.getLogger(AlarmTask.class);
 
@Scheduled(cron="*/30 * * * * *") 
public void scheduleRun(){
 Calendar calendar = Calendar.getInstance();
 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 //System.out.println("스케줄 실행 : " + dateFormat.format(calendar.getTime()));
 logger.info("스케줄 실행 : " + dateFormat.format(calendar.getTime()));
 //System.out.println("Request " + getCurrentRequest());
}
 
}
 
클래스를 만들어 준다.
 
이러면 30초마다 실행되는 것이다.
@Scheduled(cron="*/30 * * * * *") 
 

********************************************************************************************************
 
스프링에서는 간편하고 프레임워크안에서 스케쥴링 하던 quatz 를 annotation 으로 더 간단하게 설정 할 수 있다.

applicationContext.xml 같은 bean 을 설정하는 설정파일에
xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.0.xsd
<task:annotation-driven />
 
구문을 입력하면 된다.
EX) 별도의 context-schedule.xml 로 관리(첨부파일 확인)
파일명 : context-schedule.xml  ( context-schedule.xml)
 
 
스케쥴링 할 메소드위에 @scheduled 어노테이션을 입력한 후에 시간설정하면 끝
 
3. 시간 설정 @scheduled(cron=" ")  * 리눅스 crontab 과 같은 설정방법
ex> @Scheduled(cron="0 0 02 * * ?") = 매일 새벽2시에 실행
ex> @Scheduled(cron="0 0 02 2,20 * ?") = 매월 2일,20일 새벽2시에 실행
 

********************************************************************************************************

스케쥴러 cron 양식
 
초 0-59 , - * / 
분 0-59 , - * / 
시 0-23 , - * / 
일 1-31 , - * ? / L W
월 1-12 or JAN-DEC , - * / 
요일 1-7 or SUN-SAT , - * ? / L # 
년(옵션) 1970-2099 , - * /
* : 모든 값
? : 특정 값 없음
- : 범위 지정에 사용
, : 여러 값 지정 구분에 사용
/ : 초기값과 증가치 설정에 사용
L : 지정할 수 있는 범위의 마지막 값
W : 월~금요일 또는 가장 가까운 월/금요일
# : 몇 번째 무슨 요일 2#1 => 첫 번째 월요일
 
예제) Expression Meaning 
초 분 시 일 월 주(년)
 "0 0 12 * * ?" : 아무 요일, 매월, 매일 12:00:00
 "0 15 10 ? * *" : 모든 요일, 매월, 아무 날이나 10:15:00 
 "0 15 10 * * ?" : 아무 요일, 매월, 매일 10:15:00 
 "0 15 10 * * ? *" : 모든 연도, 아무 요일, 매월, 매일 10:15 
 "0 15 10 * * ? : 2005" 2005년 아무 요일이나 매월, 매일 10:15 
 "0 * 14 * * ?" : 아무 요일, 매월, 매일, 14시 매분 0초 
 "0 0/5 14 * * ?" : 아무 요일, 매월, 매일, 14시 매 5분마다 0초 
 "0 0/5 14,18 * * ?" : 아무 요일, 매월, 매일, 14시, 18시 매 5분마다 0초 
 "0 0-5 14 * * ?" : 아무 요일, 매월, 매일, 14:00 부터 매 14:05까지 매 분 0초 
 "0 10,44 14 ? 3 WED" : 3월의 매 주 수요일, 아무 날짜나 14:10:00, 14:44:00 
 "0 15 10 ? * MON-FRI" : 월~금, 매월, 아무 날이나 10:15:00 
 "0 15 10 15 * ?" : 아무 요일, 매월 15일 10:15:00 
 "0 15 10 L * ?" : 아무 요일, 매월 마지막 날 10:15:00 
 "0 15 10 ? * 6L" : 매월 마지막 금요일 아무 날이나 10:15:00 
 "0 15 10 ? * 6L 2002-2005" : 2002년부터 2005년까지 매월 마지막 금요일 아무 날이나 10:15:00 
 "0 15 10 ? * 6#3" : 매월 3번째 금요일 아무 날이나 10:15:00


Linux CronTab
예) 40 3 * * * root /home/mysql/mysql_backup.sh

맨 앞의 40은 40분을 의미함 (분을 의미:0~59)
그 뒤의 3은 03시를 의미함 (시를 의미:0~23)
그 뒤의 * 은 매일을 의미함 (일을 의미:1~31)
그 뒤의 * 은 매월을 의미함 (월을 의미:1~12)
그 뒤의 * 은 매주를 의미함(요일을 의미 1:월요일~7:일용일)
그 뒤의 root /home/mysql/mysql_backup.sh 는 root  계정으로 mysql_backup.sh을 실행하라는 의미

문자 : 각 필드에 해당하는 모든 숫자를 의미
문자 : 각 필드자리에 하이픈 문자가 올수 있음
ex) 일 필드자리에 11-15 (11,12,13,14,15일을 의미)
문자 : 각 필드자리에 콤마문자가 올수 있음
ex) 일 필드자리에 1,11,21 (1일,11일 21일을 의미)

1/1000 초 설정법
@Scheduled(fixedDelay=1000)
 1000 적으면 1초 인것이다!!!!
 30초 하려면 1000 * 30 하면 되지 뭐. 

출처: http://kanetami.tistory.com/entry/Schedule-Spring-%EC%8A%A4%ED%94%84%EB%A7%81-%EC%8A%A4%EC%BC%80%EC%A5%B4-%EC%84%A4%EC%A0%95%EB%B2%95-CronTab


반응형
Comments