Git :)

ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SpringBoot에서 Scheduling 사용하기
    Spring Boot 2023. 10. 22. 17:55
    스케줄링은 특정 시간 동안 작업을 실행하는 프로세스이다.
    Spring Boot를 통해 Spring에서 지원하는 스케줄러를 간편하게 작성할 수 있다.
    스펙 요구사항

    Schedule 기능 켜기
    • 자바 설정(Java configuration) 관련 클래스에 @EnableScheduling 를 추가하면 기능을 사용할 수 있다.
    package com.example.schedulingtasks;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.scheduling.annotation.EnableScheduling;
    
    @SpringBootApplication
    @EnableScheduling
    public class SchedulingTasksApplication {
    
    	public static void main(String[] args) {
    		SpringApplication.run(SchedulingTasksApplication.class);
    	}
    }

     

    • 스케줄링 태스크을 만들어주고, 반복 주기와 어떤 메소드가 반복될 것인지 아래와 같이 설정한다. 주의할 점은, Class가 Component로 등록돼 있어야 한다.
    package com.example.schedulingtasks;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.scheduling.annotation.Scheduled;
    import org.springframework.stereotype.Component;
    
    @Component
    public class ScheduledTasks {
    
    	private static final Logger log = LoggerFactory.getLogger(ScheduledTasks.class);
    
    	private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
    
    	@Scheduled(fixedRate = 5000)
    	public void reportCurrentTime() {
    		log.info("The time is now {}", dateFormat.format(new Date()));
    	}
    }

     

    어노테이션 내부 프라퍼티

    • @Scheduled 어노테이션을 메소드에 선언하며 실행이 가능하며 실행주기는 아래와 같은 속성으로 구성돼 있다.
      • cron
      • fixedDelay
      • fixedRate
    • cron 으로 실행주기 설정하기.

    •  fixedDelay, fixedRate로 실행주기 설정하기.
      • fixedDelay => 이전 수행이 종료된 시점부터 delay 후에 재호출
      • fixedRate => 이전 수행이 시작된 시점부터 delay 후에 재호출된다.
      • 그러므로 fixedRate 로 지정 시 동시에 여러개가 돌 가능성이 존재한다.
    Thread pool 설정
    • 기본적으로 모든 @Scheduled 작업은 Spring에 의해 생성 된 한개의 스레드 풀에서 실행된다.
    • 그렇기 때문에 하나의 Scheduled이 돌고 있다면 그것이 다 끝나야 다음 Scheduled이 실행되는 문제가 있다.
    • 스프링 부트에서 설정을 통해 Schedule에 대한 쓰래드 풀을 생성하고 그 쓰레드 풀을 사용하여 모든 스케줄 된 작업을 실행하도록 할 수 있다.

    아래는 설정 방법에 대한 예제이다.

    @Configuration
    public class SchedulerConfig implements SchedulingConfigurer {
    
        @Override
        public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
            // Thread Pool 설정
            ThreadPoolTaskScheduler threadPool = new ThreadPoolTaskScheduler();
    
            // Thread 개수 설정
            int n = Runtime.getRuntime().availableProcessors();
            threadPool.setPoolSize(n);
            threadPool.initialize();
    
            taskRegistrar.setTaskScheduler(threadPool);
        }
    }

    스케줄이 돌고있는 메소드에서 현재 스레드의 이름을 출력하면 아래와 같은 출력이 표시된다.