@Scheduled

1 분 소요

1. @Scheduled

Spring에서 지원하는 방법 중에 특정 시점이나 특정 시간 간격, 혹은 정해진 시간에 실행해야 하는 작업을 Scheduled 또는 Batch라고 함. 사람의 개입 없이 특정 시간 간격으로 작업을 실행할 수 있는 프로세스 중 하나로 사용

  • void 사용(return x)
  • parameter 사용 불가



1.1 Dependency
//build.gradle
implementation 'org.springframework.boot:spring-boot-starter-web'
//pom.xml
<dependency> 
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>


1.2 Activate
@SpringBootApplication
@EnableScheduling
public class TestApplication {

    public static void main(String[] args) {
        SpringApplication.run(TestApplication.class, args);
    }

}
  • Scheduler 활성화를 위해 Configuration class 또는 Main class에 @EnableScheduling를 추가함



2. Scheduler Supported

  • fixedDelay / fixedDelayString
  • fixedRate / fixedRateString
  • initialDelay / initialDelayString
  • cron
  • zone


2.1 fixedDelay / fixedDelayString
//application.properties
fixed.delay.string = 10000
@Scheduled(fixedDelay=10000L) 
//or @Scheduled(fixedDelayString = "${fixed.delay.string}") 
public void printLogWithFixedDelay() {
    System.out.println("print complete");
    Thread.sleep(1000L);
}
  • 해당 작업 종료 이후부터 다음 작업 실행까지의 주기(ms)
  • 11s(10s + 1s) 간격으로 작업 실행


2.2 fixedRate / fixedRateString
//application.properties
fixed.rate.string =10000
@Scheduled(fixedRate=10000L) 
//or @Scheduled(fixedRateString = "${fixed.rate.string}") 
public void printLogWithFixedRate() {
    System.out.println("print complete");
    Thread.sleep(1000L);
}
  • 이전 작업 종료 여부와 상관없이 다음 작업 실행까지의 주기(ms)
  • 10s 간격으로 작업 실행


2.3 initialDelay / initialDelayString
//application.properties
initial.delay.string = 10000
@Scheduled(initialDelay=10000) 
//or @Scheduled(initialDelayString = "${initial.delay.string}") 
public void printLogWithFixedDelay() {
    System.out.println("print when method initially started")
}
  • 작업을 최초 실행하기까지 초기 지연 시간 설정 주기
  • 10s 뒤에 최초 작업 실행


2.4 cron
  • Format : cron = “초 분 시 일 월 요일”
    • second(0 ~ 59)
    • minute(0 ~ 59)
    • hour(0 ~ 23)
    • day of month(0-31)
    • month(0-12 or JAN-DEC)
    • day of week(0-7 or MON-SUN)
    • cron 표현식 TIP
    • ,(skip)
    • *(모든 값)
    • /(기간)
  • zone : scheduling의 time zone을 설정
@Scheduled(cron = "0/10 * * * * *")
public void updateNftByScheduled(){
    List<Nft> findNfts = nftService.findTerminatedNft();
    if (!findNfts.isEmpty()){
        nftBusinessLogic.getObject().updateNftStatusToPending(findNfts);
    }
}

10s 간격으로 판매기간이 지난 nft들의 상태를 바꿔준다



3. Thread Pool

@Scheduled(fixedRate = 1000)
public void firstSchedule() {
    System.out.println("firstSchedule")
}

@Scheduled(fixedRate = 1000)
public void secondSchedule() {
    System.out.println("secondSchedule")
}
  • 원래의 Scheduled 작업은 Spring에 의해 생성된 한 개의 Thread pool에서 실행됨
  • firstSchedule 작업이 모두 완료된 후에 secondSchedule 작업이 진행됨
    • Log : firstSchedule -> secondSchedule
  • Thread pool을 생성해서 여러 개의 Schedule 작업을 동시에 실행 가능



Reference

  • https://rooted.tistory.com/12
  • https://velog.io/@kenux/Spring-Boot-Scheduled-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EA%B0%84%EB%8B%A8%ED%95%9C-%EC%8A%A4%EC%BC%80%EC%A4%84%EB%A7%81