[스프링 배치] 쿼츠 Quartz 사용하여 배치 스케줄링
- Coding/Spring Batch
- 2021. 9. 22.
쿼츠 Quartz
쿼츠란, 오픈소스 스케줄러이다. 쿼츠는 자바 환경의 규모와 상관없이 사용이 가능하고 잡 실행에 유용한 스프링 부트 지원과 같이 오래전부터 스프링 연동을 지원하고있다. 쿼츠는 아래 3가지 컴포넌트를 제공한다.
1) 스케줄러 (Scheduler)
: 스케줄러는 SchedulerFactory 를 통해서 가져올 수 있으며 JobDetails 및 트리거의 저장소 기능을 한다.
2) 잡 (Job)
3) 트리거 (Trigger)
: 작업 실행 시점을 정의한다.
: 트리거가 작동되어 쿼츠에게 잡을 실행하도록 지시하면, 잡의 개별 실행을 정의하는 JobDetails 객체가 생성된다.
스프링 배치 처리
쿼츠에서 잡과 JobDetails 객체를 정의하는 모델은 스프링 배치에서 잡과 JobInstance 를 정의하는 방식과 유사하다.
1) 스프링 배치 프로젝트 생성
2) 스프링 배치 잡 작성
3) QuartzJobBean 을 사용하여 스프링 배치 잡을 기동하는 쿼츠 잡 작성
4) 쿼츠 JobDetail 을 사용하도록 스프링이 제공하는 JobDetailBean 을 구성
5) 잡 실행 시점을 정의하도록 트리거를 구성
BatchScheduledJob.java
import org.quartz.JobExecutionContext;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.explore.JobExplorer;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.quartz.QuartzJobBean;
public class BatchScheduledJob extends QuartzJobBean {
@Autowired
private Job job;
@Autowired
private JobExplorer jobExplorer;
@Autowired
private JobLauncher jobLauncher;
@Override
protected void executeInternal(JobExecutionContext context) {
JobParameters jobParameters = new JobParametersBuilder(this.jobExplorer)
.getNextJobParameters(this.job)
.toJobParameters();
try {
this.jobLauncher.run(this.job, jobParameters);
}
catch (Exception e) {
e.printStackTrace();
}
}
}
BatchScheduledJob.java 는 QuartzJobBean 클래스를 상속한 클래스이다.
QuartzJobBean.class
: 이 클래스는 쿼츠 잡 실행에 필요하지만 개발자가 수정할 필요가 거의 없는 대부분의 배치 기능을 처리한다.
executeInternal 메서드
: 스케줄링된 이벤트가 발생할때마다 한번씩 호출된다.
쿼츠 스케줄 구성
1) 쿼츠 잡의 빈을 구성한다.
JobBuilder 를 제공한다. JobBuilder 에게 예제로 작성했던 위 BatchScheduledJob.java 를 전달한 후, 잡을 수행할 트리거가 존재하지 않더라도 쿼츠가 해당 잡 정의를 삭제하지 않도록 JobDetail 을 생성한다.
2) JobDetail 생성 후, 트리거를 만들어 스케줄링 한다.
쿼츠의 SimpleSchedulerBuilder 를 사용하여 5초마다 한번씩 잡을 기동하고, 최초 한번 수행 이후에 4번 반복할 스케줄을 정의한다.
스케줄은 얼마나 자주 JobDetail 을 실행할지에 관한 것이다. 트리거는 이 스케줄과 JobDetail 을 연관짓는다. 쿼츠의 TriggerBuilder 를 사용해 새로운 트리거를 생성하면서 잡과 스케줄을 전달한다.
- QuartzConfiguration.java
import com.example.Chapter06.quartz.BatchScheduledJob;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class QuartzConfiguration {
@Bean
public JobDetail quartzJobDetail() {
return JobBuilder.newJob(BatchScheduledJob.class)
.storeDurably()
.build();
}
@Bean
public Trigger jobTrigger() {
SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(5).withRepeatCount(4);
return TriggerBuilder.newTrigger()
.forJob(quartzJobDetail())
.withSchedule(scheduleBuilder)
.build();
}
}
예제에서 봤듯이, SimpleScheduleBuilder 를 사용하여 5초마다 최초 실행 이후 4번을 더 실행을 의미로 설정한다. 그리고 TriggerBuilder 에 실행할 배치 잡과 scheduleBuilder 를 설정하여 빈을 생성한다.
스프링배치 완벽가이드 책 참고
'Coding > Spring Batch' 카테고리의 다른 글
[스프링 배치] 오류 던지기 (throw new Exception) (2) | 2021.09.25 |
---|---|
[스프링 배치] 스텝 중지시키기 setTerminateOnly() (0) | 2021.09.25 |
[스프링 배치] JobLauncherCommandLineRunner 모든 잡 실행 설정 제거 (0) | 2021.09.20 |
[스프링 배치] 잡의 종료 상태 설정 방법 (0) | 2021.09.20 |
[스프링 배치] 배치 잡의 세션 ExecutionContext (0) | 2021.09.20 |