Spring Scheduler는 주기적으로 특정 작업을 수행할 수 있도록 스케줄링 기능을 제공합니다.
Spring의 스케줄링 기능은 Cron 표현식, 고정된 간격, 고정된 지연 등을 사용하여 작업을 예약할 수 있습니다.
Java 애플리케이션에서 작업 예약 프로세스를 단순화하여 단순하고 복잡한 예약 요구 사항 모두에 대한 강력한 지원을 제공합니다.
Spring Scheduler를 사용하려면 프로젝트에 필요한 종속성을 포함해야 합니다.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter'
}
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
스프링 프로젝트의 시작을 맡아주는 메인 애플리케이션 클래스나 스프링 프로젝트의 설정을 구성해주는 Configuration 클래스에 @EnableScheduling 어노테이션 추가를 하여서 추후에 사용할 @Scheduled 어노테이션을 활성화시켜 스프링 스케줄링을 활성화 시켜줍니다.
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
@Configuration
@EnableScheduling
public class SchedulerConfig {
}
or
@EnableScheduling
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@Component
public class ScheduledTasks {
// 첫 메서드가 호출된 24시간 이후에 실행해줍니다.
@Scheduled(initialDelay= 86400000)
public void cleanupLogs() {
System.out.println("로그를 청소합니다.");
}
// 처음 바로 실행해 주고 실행을 시작 시점을 기준으로 1시간 마다 이 작업을 실행시켜줍니다.
@Scheduled(fixedRate = 3600000)
public void sendEmailNotifications() {
System.out.println("이메일 알림을 보냅니다.");
}
// 처음 바로 실행해 주고 실행이 끝난 시점을 기준으로 1시간 마다 이 작업을 실행시켜줍니다.
@Scheduled(fixedDelay = 3600000)
public void sendEmailNotifications() {
System.out.println("이메일 알림을 보냅니다.");
}
// 매일 자정에 이 작업을 실행해줍니다.
@Scheduled(cron = "0 0 0 * * ?")
public void addDailyInterest() {
System.out.println("매일 자정에 실행됩니다.");
}
}
TaskScheduler 인터페이스: 보다 복잡한 스케줄링 요구사항을 위해 TaskScheduler 인터페이스를 사용할 수 있습니다.
@Component
@RequiredArgsConstructor
public class DelayedTaskExecutor {
private final TaskScheduler taskScheduler;
private final AlertService alertService;
public void sendDelayedAlert(String message, long delayInSeconds) {
taskScheduler.schedule(
() -> alertService.postAlert(message),
Instant.now().plusSeconds(delayInSeconds)
);
}
}
@Service
@RequiredArgsConstructor
public class DeliveryService() {
private final DelayedTaskExecutor delayedTaskExecutor;
private final DeliveryRepository deliveryRepository;
public void makeDelivery() {
Delivery delivery = deliveryRepository.startDelivery();
delayedTaskExecutor.sendDelayedAlert("Your delivery is arriving soon!", 60*10); // 10분 후 메시지 보내기
}
}
Transaction, Spring Batch, ThreadPoolTaskScheduler 등을 활용한 다면 더욱 풍성한 Spring Scheduler를 사용 할 수 있을거 같습니다.