Terracotta 라는 회사에 의해 개발된 Job Scheduling 라이브러리 입니다.
완전히 자바로 개발되어 어느 자바 프로그램에서도 쉽게 통합해서 개발할 수 있습니다.
Quartz는 수십에서 수천 개 의 작업도 실행 가능하여 간단한 interval 형식이나 Cron 표현식으로 복잡한 스케줄링도 지원합니다.
[장점]
DB 기반으로 스케줄러 간의 Clustering기능을 제공한다
- Clustering : 따로따로 작동하는 여러 컴퓨터를 놀리적으로 결합하여 전체를 한대의 컴퓨터처럼 이용할 수 있게 하는 시스템 구출 기술
In-memory Job Scheduler도 제공한다.
여러 기본 Plug- in 제공
-ShutdownHookPlugin : JVM 종료 이벤트를 캐치해서 스케줄러에게 종료를 알려준다.
-LoggingJobHistroyPlugin : Job 실행에 대한 로그를 남겨 디버깅할 때 유용하게 사용 할 수 있다.
[단점]
fixedDelay : scheulder 가 끝나는 시간으로 1초 간격으로 실행
execute(JobExecutionContext context)
JobExecutionContext
객체를 넘겨주고 execute
호출JobExecutionContext
는 Scheduler,Trigger,JobDetail 등을 포함하여 Job 인스턴스에 대한 정보를 제공하는 객체 JobDetail
을 생성할 때 JobDataMap도 같이 세팅해주면 된다.[Trigger 와 Job 의 관계]
- 1 Trigger = 1 Job : 반드시 하나의 Trigger는 반드시 하나의 Job을 지정할 수 있다.
- N Trigger = 1 Job : 하나의 Job을 여러 시간때로 실행 시킬 수 있다.
[Simple Trigger]
- 특정 시간에 Job을 수행할 때 사용되며 반복 횟수와 실행 간격 등을 지정할 수 있다.
[CronTrigger]
- cron 표현식으로 Trigger를 정의하는 방식 - cron 표현식은 SimpleTrigger 와 같이 단순 반복뿐만이 아니라 더 복잡한 스케줄링(ex. 매월 둘째주 화요일 오전 11시부터 오후 1시까지 몇분마다 실행) 도 지정할 수
- import static org.quartz.JobBuilder.*;
- import static org.quartz.SimpleScheduleBuilder.*;
- import static org.quartz.CronScheduleBuilder.*;
- import static org.quartz.CalendarIntervalScheduleBuilder.*;
- import static org.quartz.TriggerBuilder.*;
- import static org.quartz.DateBuilder.*;
- Schduler : 스케줄러에 사용되는 메인 API
- Job : 스케줄러에 의해 실행되는 실제 작업을 수행하는 개체
- JobDetail : Job 인스턴스 만드는데 사용
- Trigger : Job이 수행될 조건 정의(특정시간,횟수, 반복주기 등 )
- JobBuilder : JobDetail을 만드는데 사용되는 빌더
TriggerBuilder : Trigger을 만드는데 사요되는 빌더
public class SimpleExample {
public static void main(String[] args) throws Exception {
SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory();
Scheduler sched = schedFact.getScheduler(); //Scheduler를 가져 옴
sched.start(); //Scheduler 시작
JobDetail job = newJob(MyJob.class) //MyJob.class지정한 Job
.withIdentity("JobName", "groupName") //이름과 그룹이름 지정
.build(); Job 만듬
Trigger trigger = newTrigger() //새로운 Trigger
.withIdentity("myTrigger", "group1") //이름과 그룹이름 지정
.startNow() //start함
.withSchedule(simpleSchedule() //스케줄 지정
.withIntervalInSeconds(10) //10초마다
.repeatForever()) //계속 반복함
.build(); //트리거 만듬
sched.scheduleJob(job, trigger); //Scheduler에 job을 trigger에 따라 실행하도록 추가 함
}