회사에서 일을 하면서 Scheduler 라는 것을 처음 접하게 되었다. 회사 솔루션 특성상 클라이언트 프로그램에서 요청을 DB에 적재하면, 워커 프로그램에서 주기적으로 Scheduler을 돌리면서 DB에 새로운 요청정보가 있는지 살피고 요청이 들어오면 이를 수행해서 결과를 다시 클라이언트 프로그램으로 전달한다. 여기서는 회사에서 접한 Scheduler에 대해 정리해보도록 한다.
일정 시간 간격, 혹은 일정 시각에 특정 로직을 수행하기 위해 사용되는 것
Spring Scheduler
외에도 Spring Quartz
라는 방식으로도 구현 가능(후자가 더 사용하기 복잡하다 ...)
SpringBoot를 기준으로 우선 실행 클래스에 @EnableScheduling
을 선언하여 사용
@SpringBootApplication
@EnableScheduling
public class SchedulerApplication{
public static void main(String[] args){
SpringApplication.run(SchedulerApplication.class, args);
}
}
이후 스케쥴링을 통해 처리할 비즈니스 로직이 수행될 메소드에 @Scheduled
어노테이션을 선언
@EnableScheduling
이 선언된 패키지나, 해당 패키지 하위에 선언되야 함 @Component
public class Scheduler{
@Scheduled(fixedDelay = 1000*10)
public void schedulerMethodExample() throws Exception{
//스케쥴링할 비즈니스 로직 명시
}
}
fixedDelay
와 fixedRate
, 그리고 cron
으로 나뉨Spring Boot에서 스케줄러는 기본적으로 스레드 1개를 사용하여 동기식으로 실행되는 구조임
@EnableAsync
를 선언하여 사용하는 방법이 있음
@SpringBootApplication
@EnableScheduling
@EnableAsync //비동기적 실행을 선언
public class SchedulerApplication{
public static void main(String[] args){
SpringApplication.run(SchedulerApplication.class, args);
}
}
SchedulingConfigurer
을 구현한 SchedulerConfig 클래스에서 설정 관련 메소드를 오버라이딩하여 원하는 설정을 명시 @Configuration
public class SchedulerConfig implements SchedulingConfigurer{
private final int POOL_SIZE = 5; //스레드풀 사이즈
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar){
ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
threadPoolTaskScheduler.setPoolSize(POOL_SIZE);
threadPoolTaskScheduler.setThreadNamePrefix("myThread");
threadPoolTaskScheduler.initialize(); //Set up the ExecutorService.
//생성한 Thread pool을 작업용으로 등록
taskRegistrar.setTaskScheduler(threadPoolTaskScheduler);
}
}
@Async
를 붙여 사용 @Scheduled(fixeRate = 1000*10)
@Async
public void schedulerMethodExample() throws Exception{
//스케쥴링할 비즈니스 로직 명시
}