Scheduler
- 일정한 시간간격 또는 일정한 시각에 특정 로직을 돌리기 위해서 사용한다.
- 추가적인 의존성 주입이 필요없다.
@Scheduler
만으로 가능하다.
- Scheduler를 사용하기 위해
@EnableScheduling
를 추가해주면 된다.
@EnableScheduling @SpringBootApplication() public class MonthSubApplication { public static void main(String[] args) { SpringApplication.run(MonthSubApplication.class, args); } }
- 사용하고자 하는 Method에
@Scheduled
를 붙여주어 사용할 수 있다. - Method 는 반드시 void의 retuen 타입이어야한다.
- Method에는 Parameter를 가질 수 없다.
cron
orfixed~
로 자신이 원하는 주기마다 설정이 가능하다.
@Component public class Scheduler { private final ScheduledHandler seriesScheduledHandler; private final Logger logger = LoggerFactory.getLogger(getClass()); public Scheduler(ScheduledHandler seriesScheduledHandler) { this.seriesScheduledHandler = seriesScheduledHandler; } @Scheduled(cron = "0 0/10 * * * *") //cron 주기마다 아래 method가 실행된다. public void changeSeriesStatus() { seriesScheduledHandler.changeSeriesStatus(); } }
Scheduler의 비동기(Async) 처리
- Default로 Scheduler는 동기처리를 기본으로 한다.
단일 thread
로 동작하기 때문에 만약 원하는 주기마다 실행이 되지 않을 수 있다.
- 이를 해결하기 위해
비동기적
으로 스레드를 구성해준다.
- Async를 사용하기 위해
@EnableAsync
를 추가해준다.
@EnableAsync @EnableScheduling @SpringBootApplication() public class MonthSubApplication {}
- 다중 Thread를 위한
Thead Pool
설정을 해주도록 한다. setPoolSize( pool 사이즈 );
로 몇 개의 스레드로 동작할지를 설정해준다.
@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.initialize(); taskRegistrar.setTaskScheduler(threadPoolTaskScheduler); } }
- 마지막으로 사용하고자 하는
Scheduled Method
에@Async
를 붙여주면 된다.
@Async //비동기 처리를 위한 어노테이션 추가 @Scheduled(cron = "0 0/10 * * * *") //cron 주기마다 아래 method가 실행된다. public void changeSeriesStatus() { seriesScheduledHandler.changeSeriesStatus(); }
+) CRON 주기 설정
개요를 설명하고 →
저희 서비스에서는