반응형
Spring Boot와 Quartz 스케줄러를 사용하여, 여러 서비스 인스턴스에서의 클러스터링을 구현하는 방법을 설명합니다. Quartz의 클러스터링 기능을 활성화하여, 여러 서비스 인스턴스가 동일한 작업 스케줄을 공유하고, 한 인스턴스에서 실패한 작업을 다른 인스턴스에서 이어받을 수 있도록 구성합니다.
의존성 추가
implementation 'org.springframework.boot:spring-boot-starter-quartz'
application.properties 설정
application.properties 파일에 Quartz와 데이터베이스 관련 설정을 추가합니다. 이 설정은 Quartz가 클러스터링 모드로 작동하도록 구성하는 데 필요합니다.
# 데이터베이스 설정
spring.datasource.url=jdbc:mysql://localhost:3306/quartz_db
spring.datasource.username=myUser
spring.datasource.password=myPassword
# Quartz 설정
spring.quartz.job-store-type=jdbc
spring.quartz.properties.org.quartz.scheduler.instanceId=AUTO
spring.quartz.properties.org.quartz.jobStore.isClustered=true
spring.quartz.properties.org.quartz.jobStore.clusterCheckinInterval=20000
Quartz 스케줄러 설정
Quartz 스케줄러를 설정하는 Java 설정 클래스를 작성합니다.
import org.quartz.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class QuartzConfig {
@Bean
public JobDetail sampleJobDetail() {
return JobBuilder.newJob(SampleJob.class)
.withIdentity("sampleJob")
.storeDurably()
.build();
}
@Bean
public Trigger sampleJobTrigger(JobDetail jobDetail) {
SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(60)
.repeatForever();
return TriggerBuilder.newTrigger()
.forJob(jobDetail)
.withIdentity("sampleTrigger")
.withSchedule(scheduleBuilder)
.build();
}
}
작업(Job) 정의
Quartz에서 실행할 작업을 정의합니다.
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class SampleJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
// 작업 로직
System.out.println("Executing Sample Job");
}
}
클러스터링 확인
애플리케이션을 여러 인스턴스에서 실행한 후, Quartz 데이터베이스의 qrtz_fired_triggers 테이블을 확인하여 클러스터링이 제대로 작동하는지 확인할 수 있습니다. 각 인스턴스는 이 테이블에 자신이 실행한 작업의 레코드를 남깁니다
결론
Quartz 클러스터링은 복잡한 스케줄링 요구사항을 가진 대규모 시스템에서 매우 유용합니다. 이 설정을 통해 여러 서비스 인스턴스가 동일한 작업 스케줄을 공유하며, 한 인스턴스의 장애가 발생했을 때 다른 인스턴스가 작업을 이어받을 수 있습니다.
반응형
'SpringBoot' 카테고리의 다른 글
Spring Boot에서 RestControllerAdvice 사용 방법 (0) | 2024.11.17 |
---|---|
Spring Batch를 이용한 클러스터링과 분산 처리 설정 및 구현 방법 (0) | 2023.12.26 |
Blocking IO 와 Non-Blocking IO (0) | 2023.10.29 |
Java OOM 발생 시퀀스 (0) | 2023.10.29 |
Java Heap 메모리 할당 과정 시퀀스 (0) | 2023.10.29 |