728x90
반응형

스프링에서 Unix의 Corn 처럼 특정시간 혹은 몇분 혹은 몇시간마다 동작해는 스케쥴러를 구현해야 했다.

그래서 찾아보게 된게 Spring + Quartz Scheduler 조합의 활용이었다.

하지만 Spring 3.1 버전 부터는 Quartz Scheduler를 사용하지 않고도 Scheduler를 통한 Job을 실행할 수

있게 되었다.

 

더구나 그 설정 방법조차 무척이나 간단하게 설정이 가능하다.

설정 방법은 두가지이다.

 

첫번째 방법은 Annotion 이용하는 방법이며

두번째 방법은 XML에 직접 기술해 주는 방법이다.

 

1. Annotation 설정방법

 

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>

 

위와 같이 기술 후 저장하고 저장된 XML을 Spring contextConfigLocation 설정 파일에 추가해

주거나 component-scan XML에 추가해주면 된다.

 

2) Annotation 사용예시

@Service 
public class TaskTestService {

    @Scheduled(fixedDelay=1000)
    public void TestScheduler(){
        System.out.println("스케줄링 테스트");
    }
} 

 

위와 같이 @Scheduled 어노테이션을 이용하여 간단하게 스케쥴에 따른 작업을 처리할 수 있게 된다.

@Scheduled 의 value 같은 3가지(cron, fixedDelay, fixedRate) 종류가 있다.

 

cron은 CronTab에서의 설정과 같이 cron="0/10 * * * * ?" 과 같은 설정이 가능하고

fixedDelay은 이전에 실행된 Task의 종료시간으로 부터 정의된 시간만큼 지난 후 Task를 실행한다.(밀리세컨드 단위)

fixedRate은 이전에 실행된 Task의 시작시간으로 부터 정의된 시간만큼 지난 후 Task를 실행한다.(밀리세컨드 단위)

 

3) Cron Expression

 

왼쪽부터 오른쪽순으로 다음과 같은 의미가 있다.

  

 Seconds 

 0 ~ 59

 Minutes

 0 ~ 59

 Hours

 0 ~ 23  

 Day of Month

 1 ~ 31

 Month

 1 ~ 12 

 Day of Week

 1 ~ 7 (1 => 일요일, 7=> 토요일 / MON,SUN...) 

 Years(optional)

 1970 ~ 2099 


사용 특수문자의 사용은 아래와 같은 의미가 있다.

 

 *

 모든수를 의미, Minutes 위치에 사용될 경우 매분마다 라는 뜻 

 ?

 Day of Month, Day of Week에만 사용 가능, 특별한 값이 없다는 뜻 

 -

 기간을 설정, Hour 위치에 10 - 12 라고 쓰면 10, 11, 12dp 동작하라는 뜻 

 ,

 특정 시간을 설정. Day of Week 위치에 2, 4, 6 이라고 쓰면 월, 수, 금에만 동작하라는 뜻 

 /

 증가를 표현, Seconds 위치에 0/15로 설정되어 있으면, 0초에 시작해서 15초 간격으로 동작

 하라는 뜻 

 L

 Day Of Month 에서만 사용하며, 마지막 날의 의미 Day of Month 에 L로 설정되어 있으면 그달

 의 마지막날에 실행하라는 의미 

 W

 Day of Month 에만 사용하며, 가장 가까운 평일을 의미. 15W로 설정되어 있고 15일이 토요일

 이며, 가장 가까운 평일인 14일 금요일에 실행, 15일이 일요일이면 16일 월요일에 실행된다.

 15일이 평일이면 그날 그대로 실행됨 

 LW

 L과 W를 결합하여 사용, 그달의 마지막 평일의 의미 

 #

 Day of Week에 사용, 6#3 의 경우 3번째 주 금요일에 실행된다. 


 

사용 예

0 0 12 * * *           ==> 매일 12시에 실행

0 15 10 * * *         ==> 매일 10시 15분에 실행

0 * 14 * * *           ==> 매일 14시에 실행

0 0/5 14 18 * * *    ==> 매일 14시, 18시에 시작해서 5분간격으로 실행

0 0-5 14 * * *        ==> 매일 14시에 시작해서 0분동안 실행 

 

2. XML 설정방법


1)XML설정 방법

 



    
  

 

위와 같이 기술 후 저장하고 저장된 XML을 Spring contextConfigLocation 설정 파일에 추가해

주거나 component-scan XML에 추가해주면 된다.

 

2) 사용방법

 

@Service
public class TaskTestService {
    public void doJob(){
        System.out.println("스케줄링 중~~~!");
    }
} 


위와 같이 XML에 설정된 Class에 Method에 해당 작업내용을 기술해 놓으면  

된다.


3. 결과

위와 같은 작업을 실행하면 아래와 같은 결과를 얻을수 있다.

 

 


728x90
반응형
블로그 이미지

nineDeveloper

안녕하세요 현직 개발자 입니다 ~ 빠르게 변화하는 세상에 뒤쳐지지 않도록 우리모두 열심히 공부합시다 ~! 개발공부는 넘나 재미있는 것~!

,