[스프링 배치] 쿼츠 Quartz 사용하여 배치 스케줄링

반응형
728x90
반응형

쿼츠 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 를 설정하여 빈을 생성한다.

 

 

 

스프링배치 완벽가이드 책 참고

 

반응형

Designed by JB FACTORY