스프링 스케줄러를 이용해서 cron 설정을 런타임에 변경하는 방법을 살펴본다.
1. TaskScheduler 설정
먼저 TaskScheduler를 설정한다.
@Configuration
public class SchedulingConfiguration {
@Bean
public ThreadPoolTaskScheduler schedulerExecutor() {
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
taskScheduler.setPoolSize(4);
taskScheduler.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
return taskScheduler;
}
}
스프링 부트를 사용한다면 부트가 알아서 TaskScheduler를 만들어준다.
2. cron을 사용해서 작업을 스케줄링하는 코드 작성
다음은 cron을 이용해서 스케줄링하는 코드를 작성한다. 예제는 다음과 같다.
@Service
public class SchedulerService {
private TaskScheduler scheduler;
private String cron = "*/2 * * * * *";
private ScheduledFuture<?> future;
public SchedulerService(TaskScheduler scheduler) {
this.scheduler = scheduler;
}
public void start() {
ScheduledFuture<?> future = this.scheduler.schedule(() -> {
System.out.println("run at " + LocalDateTime.now());
},
new CronTrigger(cron));
this.future = future;
}
public void changeCron(String cron) {
if (future != null) future.cancel(true);
this.future = null;
this.cron = cron;
this.start();
}
}
scheduler.schedule()은 스케줄링을 취소할 수 있는 ScheduledFuture를 리턴한다. 이 ScheduledFuture를 이용해서 스케줄을 변경할 때 이전 스케줄을 취소하고 새 스케줄을 등록하면 된다. 위 코드에서 changeCron() 메서드는 앞서 생성한 스케줄이 있다면 future.cancel()을 이용해서 스케줄을 취소한다.
3. 스케줄 런타임 변경 확인
테스트 코드를 이용해서 실제 스케줄이 런타임에 바뀌는지 확인해보자.
@RunWith(SpringRunner.class)
@SpringBootTest
public class SchedulerServiceTest {
@Autowired
private SchedulerService schedulerService;
@Test
public void changeCron() throws InterruptedException {
schedulerService.start();
Thread.sleep(10000);
schedulerService.changeCron("*/3 * * * * *");
Thread.sleep(20000);
}
}
SchedulerService의 최초 cron 설정은 "2/* * * * * *"이므로 매 2초마다 작업을 실행한다. 위 코드는 스케줄링을 시작한 뒤에 10초간 쉬고 그 다음에 매 3초마다 작업을 실행하도록 cron 설정을 변경한다. 그리고 20초 동안 쉰다. 실행 결과는 다음과 같다.
run at 2018-12-20T23:03:02.003
run at 2018-12-20T23:03:04.002
run at 2018-12-20T23:03:06.001
run at 2018-12-20T23:03:08.001
run at 2018-12-20T23:03:10.002
run at 2018-12-20T23:03:12.002
run at 2018-12-20T23:03:15.002
run at 2018-12-20T23:03:18.003
run at 2018-12-20T23:03:21.001
run at 2018-12-20T23:03:24.001
run at 2018-12-20T23:03:27.002
run at 2018-12-20T23:03:30.001
위 결과를 보면 2초 마다 실행하다가 changeCron()을 실행한 뒤부터는 3초 마다 실행하는 것을 확인할 수 있다.
예제 코드는 https://github.com/madvirus/spring-scheduler-cron-change 에서 확인할 수 있다.