[Spring] 스프링에서 Scheduler 사용하기

    스케쥴링을 위해서 while(true)로 무한으로 돌린 후, sleep 걸어서 사용하거나 linux에서 crontab으로 주기적으로 실행하는 방법을 이용할 수 있겠지만 스프링 프레임워크(spring framework)에서는 crontab을 내장해서 사용하는 듯한 매우 편리한 방법을 제공해준다.

     

    스케쥴러를 사용하기 위해서는 spring task라는 내장되어 있는 기능을 사용하면 된다. 예전에는 쿼츠(Quartz)를 많이 활용했던 걸로 기억하는데 본 포스팅의 방식으로 핸들링이 안된다면 Quartz를 한번 찾아보길 바란다. 

     

    스프링 scheduler를 사용할 때 어노테이션(annotation)으로 심플하게 제어하는 방법과 xml으로 핸들링하는 방법이 있는데 본 포스팅에서는 xml이 아닌 annotation으로만 제어하도록 한다.

     

    스키마 설정

    task schema를 등록(dispatcher-servlet.xml에서 작업함, 위치 변경 가능)

    xmlns:task라는 스키마를 등록하는 것과 스키마경로를 지정 한후, 하단에 task:annotation-drive 태그를 입력한다. 

    xmlns:task="http://www.springframework.org/schema/task"
    xsi:schemaLocation=
    http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd"
    
    <task:annotation-driven />

     

     

    어노테이션 설정

    스케쥴링을 원하는 메소드에 @Scheduled라는 어노테이션을 붙이고, 스케쥴링을 설정하면 된다. 스케쥴은 크론탭과 같은 방식을 제공하니 크론탭이 편리하다면 크론탭의 방식을 사용하면 된다.

     

    fixed 방식

    // 3초마다 실행
    @Scheduled(fixedDelay=3000)
    public void test() {
    	System.out.println("dely 3000");
    }

    fixedDelay 

    - 실행된 task의 종료 시간으로부터 지정된(ms 단위) 시간이 지난 후 실행 된다.

     

    fixedRate

    - 실행된 시간으로부터 지정된(ms) 시간이 지난 후 실행 된다.

     

    Cron 방식

    // 5초마다 실행
    @Scheduled(cron = "*/5 * * * * *")
    public void test2() {
    	System.out.println("dely 5000");
    }

    cron 방식을 활용하면 정해진 요일, 혹은 시간등이 필요할 경우 cron 방식으로 시간과 날짜 등을 지정할 수 있다. 

    cron은 내용이 방대하기 때문에 자세한 내용은 아래 링크 참조

     

    스케쥴링 결과

    // 3초마다 실행
    @Scheduled(fixedDelay=3000)
    public void test() {
    	System.out.println("delay 3000");
    }
    	
    	
    // 5초마다 실행
    @Scheduled(cron = "*/5 * * * * *")
    public void test2() {
    	System.out.println("delay 5000");
    }
    
    
    # Result
    delay 3000
    delay 5000
    delay 3000
    delay 3000
    delay 5000
    delay 3000
    delay 5000
    delay 3000
    delay 3000

    위와 같이 3초와 5초가 번갈아가면서 제때 나오는 것을 확인할 수 있다.

     

     

    참고자료

    https://en.wikipedia.org/wiki/Cron
    https://zetawiki.com/wiki/%EB%A6%AC%EB%88%85%EC%8A%A4_%EB%B0%98%EB%B3%B5_%EC%98%88%EC%95%BD%EC%9E%91%EC%97%85_cron,_crond,_crontab

    댓글

    Designed by JB FACTORY