[Spring] @Scheduled

2019. 10. 30. 19:18
반응형

@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이다.

 

다음은 동적으로 스케줄러를 멈추고 시간주기를 바꾸는 법에 대해 포스팅 하겠습니다.

반응형

+ Recent posts