JAVA/SpringBoot

# Java - ScheduledExecutorService 와 Springboot 의 @Scheduled 예제

skysoo1111 2020. 5. 8. 14:14

특정 주기마다 어떤 동작을 수행(스케줄링)하는 프로그램을 작성할 때, 구현 방법은 다양할 것이다. 그 중에서 오늘은 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);
}

1-1 실행 결과

 

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. ");
    }
}
  • 단어장에 추가
     
    • 다음에 대한 단어 목록이 없습니다한국어 -> 영어...
       
    • 새로운 단어 목록 생성...
  • 복사
  • 단어장에 추가
     
    • 다음에 대한 단어 목록이 없습니다영어 -> 한국어...
       
    • 새로운 단어 목록 생성...
  • 복사

2-1 실행 결과

 

  • 단어장에 추가
     
    • 다음에 대한 단어 목록이 없습니다영어 -> 한국어...
       
    • 새로운 단어 목록 생성...
  • 복사
  • 단어장에 추가
     
    • 다음에 대한 단어 목록이 없습니다영어 -> 한국어...
       
    • 새로운 단어 목록 생성...
  • 복사

'JAVA > SpringBoot' 카테고리의 다른 글

# Spring PostgreSQL JPA 설정  (0) 2019.10.11