ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] Spring에서 Scheduler 처리하기
    Spring 2022. 10. 26. 09:08
    반응형

    일정한 시간간격 또는 일정한 시각에 특정 로직을 돌리기 위해서 사용하는 것을
    'Scheduler' 라고 한다.
    Spring에선 'Spring Scheduler' 라이브러리를 제공한다.


     💡 Spring Scheduler

    • Spring Scheduler는 Spring Boot starter에 기본적인 의존성이 제공되기 때문에 별도의 추가적인 의존성이 필요하지 않다.
    • 사용하기 위해서 Application Class에 @EnableScheduling 어노테이션 선언

    Application.class

    @EnableScheduling
    @SpringBootApplication
    public class Application {
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    }



    그리고 @Scheduled 어노테이션을 지정하는 메서드에 선언한다. @Scheduled Method는 두 가지 규칙을 가지고 있어야 한다.

     -   method는 void의 return Type 가져야 함
     -   method는 파라미터를 가질 수 없음

     


    ScheduleTask.class
    public class Scheculer() {
    
        @Scheduled(fixedDelay = 1000) // scheduler 끝나는 시간 기준으로 1초 간격으로 실행
        public void scheduleFixedDelayTask() {
            System.out.println(
                    "Fixed delay task - " + System.currentTimeMillis() / 1000);
        }
    
        @Scheduled(fixedRate = 1000) // scheduler 시작하는 시간 기준으로 1초 간격으로 실행
        public void scheduleFixedRateTask() {
            System.out.println(
                    "Fixed rate task - " + System.currentTimeMillis() / 1000);
        }
    
        
        @Transactional(rollbackFor = Exception.class)
        @Scheduled(cron = "0 1 0 * * *") // 매일 0시 1분 마다 실행
        public void autoDeletePhoneNumSert() {
            log.info("======== PhoneNumCert Manage Task start ========");
            int cnt = taskPhoneNumCertMapper.deleteByCreatedDt();
            log.info(cnt + "개 정보 삭제");
            log.info("======== PhoneNumCert Manage Task completed ========");
        }
    
    
     @Scheduled(cron = "0 15 10 15 * ?", zone = "Europe/Paris") // cron에 TimeZone 설정 추가
    }

     

    ❗️ Cron 표현식을 통해 특정 시각에 실행되게끔 할 수 있다.
    • Cron 표현식 : 7개의 각 필드로 구성되어 있으며, 각 필드의 내용은 아래와 같다.

             

     초  | 분   |  시 |  일  |  월  | 요일 | 연도
    0~59| 0~59 | 0~23| 1~31| 1~12| 0~6 | 생략가능
    
    요일: 0 (일요일) ~ 6(토요일)
    ?: 설정 값 없을 때 - 일과 요일에서만 사용 가능
    * : 모든 조건
    시작시간 / 단위 : 시작시간 부터 해당 단위 때
    시작범위-끝범위 : 시작범위 부터 끝 범위까지
    L : 마지막-일, 요일에서만 사용 가능
    W: 가장 가까운 평일 찾는다 - 일 에서만 사용 가능
    ex) 10W
    
    10일이 평일 일 때 : 10일에 실행
    10일이 토요일 일 때 : 가장 가까운 평일인 금요일(9일)에 참
    10일이 일요일 일 때 : 가장 가까운 평일인 월요일(11일)에 참
    # : 몇 주 째인지 찾는다 - 요일 에서만 사용 가능
    ex) 3#2 : 수요일 #2째주에 참
     

    Properties

     

    cron cron표현식을 지원한다. "초 분 시 일 월 요일(년)"으로 표현한다. 
    fixedDelay milliseconds 단위로, 이전 작업이 끝난 시점으로 부터 고정된 시간을 설정한다. ex) fixedDelay = 5000
    fixedDelayString fixedDelay와 같은데 property의 value만 문자열로 넣는 것이다. ex) fixedDelay = "5000"
    fixedRate milliseconds 단위로, 이전 작업이 수행되기 시작한 시점으로 부터 고정된 시간을 설정한다. ex) fixedRate = 3000
    fixedRateString fixedDelay와 같은데 property의 value만 문자열로 넣는 것이다. ex) fixedRate = "3000"
    initialDelay 스케줄러에서 메서드가 등록되자마자 수행하는 것이 아닌 초기 지연시간을 설정하는 것이다.
    initialDelayString 위와 마찬가지로 문자열로 값을 표현하겠다는 의미다.
    zone cron표현식을 사용했을 때 사용할 time zone으로 따로 설정하지 않으면 기본적으로 서버의 time zone이다.






    출처 : https://jeong-pro.tistory.com/186

             https://sabarada.tistory.com/113

             https://m.blog.naver.com/deeperain/221609802306

    반응형

    댓글

Designed by Tistory.