특정 주기마다 어떤 동작을 수행(스케줄링)하는 프로그램을 작성할 때, 구현 방법은 다양할 것이다. 그 중에서 오늘은 ScheduledExecutorService 와 Springboot의 @Scheduled 를 이용한 스케줄링 방법에 대해 알아보려고 한다.
1. ScheduledExecutorService
먼저 ScheduledExecutorService는 Java 1.5부터 지원되는 스케줄링이 가능한 Executor 서비스로 인터페이스이며, 구현체로 ScheduledThreadPoolExecutor() 가 있다.
ScheduledExecutorService는 3가지의 지연 스케줄링 방식을 지원한다.
/**
* 지정된 dealy 시간만큼 지연 후에 1번의 command를 실행한다.
*
* @param command 스케줄링 시킬 함수
* @param delay 지연 시간 주기
* @param unit delay 지연 시간 주기의 단위
*/
public ScheduledFuture<?> schedule(Runnable command,
long delay,
TimeUnit unit);
/**
* 지정된 initialDelay 후에 최초로 command가 실행 되고,
* 그 뒤로는 period 마다 주기적으로 command를 실행한다.
*
* @param command 스케줄링 시킬 함수
* @param initialDelay 최초 실행의 지연 시간
* @param period 후속의 실행 간격
* @param unit initialDelay 및 period 시간 주기의 단위
*/
public ScheduledFuture<?> scheduleAtFixedRate(Runnable command,
long initialDelay,
long period,
TimeUnit unit);
/**
* 지정된 initialDelay 후에 최초로 command가 실행 되고,
* 앞의 command가 종료된 다음 delay만큼 지연된 후 command를 실행한다.
*
* @param command 스케줄링 시킬 함수
* @param initialDelay 최초 실행의 지연 시간
* @param delay 실행 종료로부터 후속의 실행 간격
* @param unit initialDelay 및 delay 시간 주기의 단위
*/
public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,
long initialDelay,
long delay,
TimeUnit unit);
1-1. ScheduledExecutorService 예제 코드
@Slf4j
public class BasicScheduled {
public static void main(String[] args) {
single(()->{
log.info("Scheduler Start. ");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.info("Scheduler Stop.");
},100,100,TimeUnit.MILLISECONDS);
}
public static ScheduledFuture<?> single(Runnable func, int initDelay, int delay, TimeUnit timeUnit){
ScheduledExecutorService ses = Executors.newScheduledThreadPool(5);
return ses.scheduleAtFixedRate(func,initDelay,delay,timeUnit);
}
2. SpringBoot의 @Scheuled
SpringBoot에서는 스케줄링 인터페이스를 직접 구현할 필요가 없다.
@EnableScheduling 어노테이션으로 스케줄링을 사용하겠다는 것을 명시하고,
@Scheduled 어노테이션으로 스케줄링 할 함수를 지정해주면 된다.
2-1. SpringBoot의 @Scheuled 예제 코드
@Slf4j
@EnableScheduling
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class SpringScheduled {
public static void main(String[] args) {
SpringApplication.run(SpringScheduled.class,args);
}
@Scheduled(fixedRateString = "5000", initialDelay = 100)
public void schedulerTest() throws InterruptedException {
log.info("Spring Scheduler Start. ");
Thread.sleep(1000);
log.info("Spring Scheduler Stop. ");
}
}
'JAVA > SpringBoot' 카테고리의 다른 글
# Spring PostgreSQL JPA 설정 (0) | 2019.10.11 |
---|