1. 의존성 확인
spring-boot-starter에 스케줄링 기능이 포함되어 있어 별도의 의존성 추가가 필요하지 않습니다.
2. 스케줄링 활성화
@EnableScheduling 애노테이션을 사용하여 스케줄링을 활성화합니다.
메인 애플리케이션 클래스나 설정 클래스에 추가합니다.
@SpringBootApplication
@EnableScheduling
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(TestApplication.class, args);
}
}
3. @Scheduled 어노테이션 사용
스케줄링하려는 메서드에 @Scheduled 애노테이션을 추가합니다.
주의사항으로 메서드에 인자를 받지 않는 void 리턴 타입의 메서드에만 적용할 수 있습니다.
- fixedRate: 고정된 주기로 메서드를 실행합니다. (밀리초 단위)
- fixedDelay: 이전 호출이 끝난 후 고정된 시간이 지난 후에 다음 메서드를 실행합니다. (밀리초 단위)
- cron: CRON 표현식을 사용하여 메서드 실행 시간을 정의합니다.
* * * * * *
초(0-59) 분(0-59) 시간(0-23) 일(1-31) 월(1-12) 요일(0-7)
각 별 위치에 따라 주기를 다르게 설정 할 수 있음.
요일설징: 1~6(월요일~토요일) 0,7(일요일)
기본적으로 스프링 스케줄러는 단일 스레드에서 동작합니다.
한 작업이 오래 걸리면 다른 스케줄링 작업이 지연될 수 있어 필요한 경우 스레드 풀을 설정이 필요합니다.
@Component
@Slf4j
public class ScheduledTasks {
@Scheduled(fixedRate = 30000)
public void taskAtThirtySeconds() {
log.info("task at 30 seconds");
}
@Scheduled(cron = "0 0 12 * * ?")
public void runAtNoonEveryDay() {
System.out.println("Every day at noon");
}
}
4. TaskScheduler Bean 설정
ThreadPoolTaskScheduler를 사용하여 스레드 풀을 설정할 수 있습니다.
아래와 같이 Config 클래스에 TaskScheduler Bean을 정의합니다.
메인 어플리케이션 클래스에서 @EnableScheduling 어노테이션은 생략 가능합니다.
@Configuration
@EnableScheduling
public class SchedulerConfig {
@Bean
public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
// 원하는 스레드 풀 크기를 설정합니다.
scheduler.setPoolSize(10);
// 로그 접두사를 설정합니다.
scheduler.setThreadNamePrefix("scheduled-task-");
// shutdown 되기 전 task 모두 처리 될때까지 대기합니다. (30초)
scheduler.setWaitForTasksToCompleteOnShutdown(true);
scheduler.setAwaitTerminationSeconds(30);
return scheduler;
}
}
5. 동작 원리
@EnableScheduling 애노테이션이 설정 클래스에 추가되면 ScheduledAnnotationBeanPostProcessor가
애플리케이션 컨텍스트에 등록됩니다.
- Bean 초기화 후 추가 작업으로 postProcessAfterInitialization 메서드가 실행됩니다.
- @Scheduled 애노테이션이 붙은 메서드를 찾으면 해당 메서드의 스케줄링 정보(예: fixedRate, cron 등)를
읽어와 스케줄링 작업을 등록합니다. - 스케줄링 작업은 내부적으로 TaskScheduler를 사용하여 실행됩니다.
읽어주셔서 감사합니다.
레퍼런스
반응형
최근댓글