ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] Scheduler(@Scheduled) - fixedDelay vs fixedRate
    Study/Spring 2023. 12. 17.

     

    스프링 프레임워크의 Scheduler를 사용하다 보면 

     

    fixedDelay(fixedDelayString), fixedRate(fixedRateStrring), cron과 같은 설정을 하게 된다.

     

    이는 스케쥴러의 작동 주기를 설정하는 것이다.

     

     

    cron은 지정한 cron 표현식에 맞춰 작동하게 된다.

     

    cron 식은 추후에 별도로 정리하도록 하고, 

     

    이번에는 fixedDelay와 fixedRate에 대해서 알아보도록 하자.

     

     


     

    package com.sendbox.asynctest.service;
    
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.scheduling.annotation.Scheduled;
    import org.springframework.stereotype.Component;
    
    import java.time.LocalDateTime;
    import java.time.format.DateTimeFormatter;
    
    @Slf4j
    @Component
    public class TestScheduler {
    
        @Scheduled(fixedRate = 1000)
        public void rateScheduler() {
            log.info("RATE_START : {}", getNowTimeToString());
    
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
    
            log.info("RATE_END : {}", getNowTimeToString());
        }
    
        @Scheduled(fixedDelay = 1000)
        public void delayScheduler() {
            log.info("DELAY_START : {}", getNowTimeToString());
    
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
    
            log.info("DELAY_END : {}", getNowTimeToString());
        }
    
        private String getNowTimeToString() {
            LocalDateTime currentTime = LocalDateTime.now();
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
            return currentTime.format(formatter);
        }
    }
    

     

    테스트를 위한 코드는 다음과 같이 작성했다. 

     

     

    이제 로그를 확인해보자.

     

     

    로그를 통해서 확인해 봤을 때 

     

    Rate는 (약간의 차이는 존재하는 것 같다..) 매 1초마다 시작되었다.

     

    Delay는 이전 스케쥴러의 작업이 끝났을 때를 기준으로 1초가 지난 뒤 시작되었다.

     

     

    fixedRate : 정해진 시간(1000ms(1초))마다 실행된다.
    fixedDelay : 이전 스케쥴러의 작업이 끝난 시점을 기준으로 정해진 시간(1000ms) 이후 실행된다.

     

     

     

    만약, Rate의 경우 매 1초마다 실행하도록 설정해 놓았는데, 

     

    이전 스케쥴러가 1초 넘게 실행되고 있다면 어떻게 될까??

     

     

    실행 주기 설정값(1000)은 그대로 두고, 쓰레드 sleep 시간을 3초로 늘렸다.

     

     

    Rate는 이전 스케쥴러가 끝난 시점이 다음 실행 시점 이후인 경우에는 바로 시작되었다.

     

    Delay는 위의 실행 결과와 같게 이전 스케쥴러가 끝난 시점 이후 1초가 지난 뒤 시작되었다.

     

     

     

    즉, Rate로 설정을 했더라도 이전 스케쥴러의 작동 시간이 길어졌다면

     

    다음 스케쥴러의 실행 시간을 100% 보장할 수는 없다.

     

     

     

    그렇다면 어떻게 해야 스케쥴러의 실행 시간을 보장할 수 있게 해 줄 수 있을까?

     

    이 해답은, 스케쥴러를 비동기적으로 처리하여

    이전 스케쥴러의 종료 시점과 상관없게(사실... 상관은 있다) 설정해 주면 최대한 실행 시간을 보장해 줄 수 있게 된다

     

     

     

Designed by Tistory.