1. Quartz란?
Quartz는 Terracotta라는 회사에 의해 개발된 Job Scheduling 라이브러리이다. 완전히 자바로 개발되어 어느 자바 프로그램에서도 쉽게 통합해서 개발할 수 있다. Quartz는 수십에서 수천 개의 작업도 실행 가능하며 간단한 interval 형식이나 Cron 표현식으로 복잡한 스케줄링도 지원한다. 예를들면, 매주 금요일 새벽 1시 30분에 매주 실행하는 작업이나 매월 마지막 날에 실행하는 작업도 지정할 수 있다.
2. 라이브러리 다운로드 링크
http://www.quartz-scheduler.org/downloads/
3. 구성요소
Job
- Quartz API에서 단 하나의 메서드를 가진 excute Job 인터페이스를 제공한다. Quartz를 사용하는 개발자는 수행해야 하는 실제 작업을 이 메서드에서 구현하면 된다.
- Job의 Trigger가 발생하면 스케줄러는 JobExecutionContext 객체를 넘겨주고 excute 메서드를 호출한다.
- JobExecutionContext는 Scheduler, Trigger, JobDetail 등을 포함하여 Job 인스턴스에 대한 정보를 제공하는 객체이다.
JobDataMap
- JobDataMap은 Job 인스턴스가 실행할 때 사용할 수 있게 원하는 정보를 담을 수 있는 객체이다.
- JobDetail을 생성할 때 JobDataMap도 같이 세팅해주면 된다.
- Job 실행 시 스케줄러에 Job 추가시 넣었던 JobDataMap 객체를 아래와 같이 접근하여 사용할 수 있다.
JobDetail
- Job을 실행시키기 위한 정보를 담고 있는 객체이다. Job의 이름, 그룹, JobDataMap 속성 등을 지정할 수 있다. Trigger가 Job을 수행할 때, 이 정보를 기반으로 스케줄링을 한다.
Trigger
- Trigger는 Job을 실행시킬 스케줄링 조건 (ex 반복 횟수, 시작 시간)등을 담고 있고 Scheduler는 이 정보를 기반으로 Job을 수행시킨다.
- Trigger와 Job의 관계 정리
- 1 Trigger = 1 Job
- 반드시 하나의 Trigger는 반드시 하나의 Job을 지정할 수 있다.
- N Trigger = 1 Job
- 하나의 Job을 여러 시간때로 실행시킬 수 있다. (ex. 매주 토요일, 매 시간마다)
- Trigger는 2가지 형태로 지정할 수 있다.
- SimpleTrigger
- 특정 시간에 Job을 수행할 때 사용되며 반복 횟수와 실행 간격등을 지정할 수 있다.
- Cron Trigger
- CronTrigger는 cron 표현식으로 Trigger를 정의하는 방식이다. (ex. 매일 12시 - '0 0 12 * * ?')
- Cron 표현식은 SimpleTrigger와 같이 단순 반복뿐만이 아니라 더 복잡한 스케줄링(ex. 매월 마지막 금요일에 오후 3시부터 3시까지 몇분마다 실행)도 지정할 수 있다.
- Cron 표현식은 이곳을 참조
Misfire Instructions
- Misfire는 Job이 실행되어야 하는 시간, fire time을 지키지 못한 실행 불발을 의미한다.
- 이런 Misfire는 Scheduler가 종료될 때나 쓰레드 풀에 사용 가능한 쓰레드가 없는 경우에 발생할 수 있다.
- Scheduler가 Misfire된 Trigger에 대해서 어떻게 처리할 지에 대한 다양한 policy를 지원한다.
ex)
- MISFIRE_INSTRUCTION_FIRE_NOW - 바로 실행
- MISFIRE_INSTRUCTION_DO_NOTHING - 아무것도 하지 않음
Listener
- Listener는 Scheduler의 이벤트를 받을 수 있도록 Quartz에서 제공하는 인터페이스이며 2가지를 제공한다.
- JobListener
- Job 실행 전 후로 이벤트를 받을 수 있다.
- TriggerListener
- Trigger가 발생하거나 불발이 일어날 때나 Trigeer를 완료할 때 이벤트를 받을 수 있다.
JobStore
- Job과 Trigger의 정보를 2가지 방식으로 저장할 수 있다.
- RAMJobStore
- 기본값으로 메모리에 스케줄 정보를 저장한다.
- 메모리에 저장하기 때문에 성능면에서는 제일 좋지만, 시스템 문제 발생 시 스케줄 데이터를 유지하지 못하는 단점이 있다.
- JDBC JobStore
- 스케줄 정보를 DB에 저장한다.
- 시스템이 셧다운 되더라도 스케줄 정보는 유지되어 시스템 재시작시 다시 Job을 실행할 수 있다.
다른 기타 JobStore
- Quartz JobStore을 확장하여 다른 저장소 (Redis, MongoDB0에도 저장할 수 있다. 실제 구현은 아래 링크 참조