Quartz란?
Quartz는 자바기반의 스케줄러 라이브러리 입니다. 일정한 주기의 Job을 실행하기 위해 Jenkins 혹은 Quartz 등을 사용하는데 Jenkins에 비교하여 좀 더 세밀한 스케줄링이 필요하거나 비즈니스 로직에 의하여 Job이 실행될 수 있다는 특징이 있습니다. Quartz 웹 바로가기
Quartz의 구조
Quartz는 모듈식 아키텍쳐를 사용하여 필요에 따라 조합할 수 있는 Scheduler, Trigger, Job 등의 요소들로 구성됩니다. 간단하게 설명하면 Scheduler가 언제, 어떤주기로, 언제까지 실행할 지를 나타내는 Trigger를 이용해서 JobDetail에 구현된 Job의 제반정보를 실행합니다.
기본적으로는 인메모리 JobStore가 사용되는데 spring.quartz.job-store-type = jdbc 설정을 하면 JDBC 저장소를 구성할 수 있습니다.
설정에 대한 설명은 아래 링크에 있습니다. 링크
- Scheduler : 작업 스케줄링, 스케줄 추가, 제거 등 을 위한 기본 API
- Job : 작업을 작성하는 곳인 excute()라는 단일 메서드를 가지는 인터페이스. 작업을 나타내는 클래스에 의해 구현되어집니다.
- JobDetail : 작업의 인스턴스를 정의하며 작업이 실행될 때 작업에 전달되는 JobDataMap의 형태로 데이터를 포함합니다. 모든 JobDetail은 고유한 이름과 그룹으로 구성된 JobKey 로 식별됩니다.
- Trigger : 주어진 작업이 실행될 일정을 정의하는 구성 요소로 Job에는 여러개가 Trigger가 있을 수 있지만 Trigger는 하나의 Job에만 연관될 수 있습니다.
- JobBuilder : Job의 인스턴스를 정의하는 JobDetail 인스턴스를 정의, 빌드하는 데 사용됩니다.
- TriggerBuilder : 트리거 인스턴스를 정의, 빌드하는 데 사용됩니다.
Spring Boot에서 시작하기
Spring Boot에서는 spring-boot-starter-quartz 를 통해 간단하게 Quartz를 사용할 수 있습니다. 간단하게 로그를 찍어보는 예제코드를 만들어 보겠습니다.
- 의존성 추가
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
- HelloJob 코드
package com.sy.helloquartz;
import lombok.extern.slf4j.Slf4j;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
@Slf4j
public class HelloJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException{
//JobExcutionContext에서 정보를 가져옴
log.info("Job ** {} ** fired @ {}", context.getJobDetail().getKey().getName(), context.getFireTime());
log.info("### Hello ###");
log.info("Next job scheduled @ {}", context.getNextFireTime());
}
}
- 실행 코드
SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory();
Scheduler sched = schedFact.getScheduler();
sched.start();
// HelloJob 클래스로 job 정의
JobDetail job = newJob(HelloJob.class)
.withIdentity("myJob", "group1")
//.usingJobData(jobDataMap) jobDataMap 주입 가능
.build();
// Trigger 생성
Trigger trigger = newTrigger()
.withIdentity("myTrigger", "group1")
.startNow()
.withSchedule(simpleSchedule()
.withIntervalInSeconds(40)
.repeatForever())
.build();
//스케쥴러에 Trigger를 사용하는 Job 등록
sched.scheduleJob(job, trigger);
- 결과
2019-01-31 09:23:08.091 INFO 5514 --- [ main] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.0 2019-01-31 09:23:08.091 INFO 5514 --- [ main] org.quartz.core.QuartzScheduler : Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started. 2019-01-31 09:23:08.101 INFO 5514 --- [eduler_Worker-1] com.sy.helloquartz.HelloJob : Job ** myJob ** fired @ Thu Jan 31 09:23:08 KST 2019