Quartz란?
- Job Scheduling 라이브러리
- 자바로 개발되어 모든 자바 프로그램에서 사용 가능
- 간단한 interval형식이나 Cron 표현식 스케줄링 지원
- (ex. 매주 금요일 새벽 1시, 1시간 마다 한번씩)
장점
- DB 기반으로 스케줄러 간 클러스터링 기능 제공
- 시스템 Fail-over / Random 방식의 로드 분산처리 지원
- In-memory Job scheduler 제공
- 여러 기본 플러그인 제공
- ShutdownHookPlugin – JVM 종료 이벤트 캐치
- LoggingJobHistoryPlugin – Job 실행 로그 남기기
단점
- Random 방식 클러스터링 기능이라 완벽한 로드 분산 x
- 스케줄링 실행에 대한 히스토리 보관 x
용어 정리
Job
- Quartz API에서 excute 메서드 인터페이스 제공
- 수행할 실제 작업을 이 메서드에서 구현
- Trigger가 발생하면 스케줄러는 JobExecutionContext 객체를 넘겨주고 excute 메서드를 호출
- JobExecutionContext : Scheduler, Trigger, JobDetail 등을 포함한 Job 인스턴스에 대한 정보를 제공하는 객체
JobDataMap
- Job 인스턴스가 실행할 때 사용할 수 있게 원하는 정보를 담을 수 있는 객체
- JobDetail을 생성할 때, JobDataMap도 같이 세팅
- JobExecutionContext객체.getJobDetail().getJobDataMap() 으로 접근 가능
JobDetail
- Job을 실행시키기 위한 정보를 담고있는 객체
- Job의 이름, 그룹, JobDataMap 속성 등 지정 가능
- Trigger가 Job을 수행할 때 이 정보를 기반으로 스케줄링함
Trigger
- Job을 실행시킬 스케줄링 조건 (반복 횟수, 시작 시간) 등을 담고 있음
- 스케줄러는 이 정보를 기반으로 Job을 수행시킴
- 1 Trigger = 1 Job (하나의 트리거는 하나의 Job만 지정가능)
- N Trigger = 1 Job (하나의 Job을 여러 조건으로 실행 가능)
- SimpleTrigger
- 특정 시간 / 반복 횟수 / 실행 간격 등을 지정할 수 있음
- CronTrigger
- Cron 표현식으로 Trigger를 정의
- SimpleTrigger와 같은 단순 반복 + 복잡한 스케줄링 가능
- ex. 매월 마지막 금요일 오후 3시부터 3시까지 몇 분마다 실행
Misfire Instructions
- Misfire : Fire time(Job이 실행되어야 하는 시간)을 지키지 못한 실행 불발
- 스케줄러가 종료될 때 / 쓰레드 풀에 사용 가능한 쓰레드가 없는 경우 발생 가능
- Misfire trigger에 대해 다양한 처리 policy 지원
- MISFIRE_INSTRUCTION_FIRE_NOW : 바로 실행
- MISFIRE_INSTRUCTION_DO_NOTHING : 아무것도 하지 않음
Listener
- 스케줄러의 이벤트를 받을 수 있도록 Quartz에서 제공하는 인터페이스
- JobListener
- Job 실행 전후로 이벤트를 받을 수 있음
- jobExecutionVetoed : TriggersListener.vetoJobExecution() 메서드에서 veto(거부, 금지)를 시킨 경우 호출됨
- TriggerListener
- Trigger가 발생, 불발, 또는 완료할 때 이벤트를 받을 수 있음(triggerFire, triggerMisfired)
- vetoJobExecution : 해당 Trigger를 veto(거부, 금지) 시킬지 결정할 수 있는 메서드로 true이면 veto를 시켜서 Job이 실행되지 않고 false이면 veto를 시키지 않아 Job을 실행시킬 수 있음
JobStore
- Job과 Trigger의 정보를 2가지 방식으로 저장 가능
- RAMJobStore
- 기본 값으로 메모리에 스케줄 정보를 저장
- 성능은 좋지만 시스템 문제 발생 시 데이터를 유지하지 못함
- JDBC JobStore
- 스케줄 정보를 DB에 저장
- 시스템 셧다운되더라도 스케줄 정보 유지
Quartz 메타테이블
- qrtz_triggers
- General information of triggers
- 저장된 모든 트리거의 일반 정보 / 트리거의 종류를 구별
- qrtz_cron_triggers
- 등록된 cron trigger의 cron 정보
- qrtz_simple_triggers
- 등록된 simple trigger의 정보 (repeat_count, repeat_interval, times_triggered)
- qrtz_blob_triggers
- 등록된 blob trigger의 정보
- qrtz_fired_triggers
- 현재 실행된(fired) 스케줄의 트리거 정보
- 비동기 동작 시 바로 실행 완료 상태가 되어서 해당 테이블은 스쳐지나감
- qrtz_job_details
- task to be executed
- 실행될 Quartz job 정보
- qrtz_paused trigger_grps
- saved information about triggers which are not active
- 정지된 트리거 그룹
- qrtz_calendars
- exclude blocks of time from the trigger’s firing schedule
- 특정 시간에 스케줄 동작시키지 않고 싶을 때 사용
- 특정 시간 범위를 지정하고 싶을 때 사용
- ex. 매주 평일 9:30 am에 동작하는 트리거에 Calendar를 추가해 모든 휴일을 제외하는 경우
- qrtz_scheduler_state
- 스케줄러 상태 확인 (실패하거나 죽는 경우를 위해)
- INSTANCE_NAME 컬럼으로 스케줄러 구분
- LAST_CHECKIN_TIME이 CHECKIN_INTERVAL 간격으로 계속해서 갱신됨
- 스케줄러가 죽은 경우 last_checkin_time + checkin_interval 값이 현재 시간보다 작아지므로 이를 활용해 판별함
- qrtz_locks
- stores the value of the instance name executing the job, to avoid the scenario of multiple nodes executing the same job
- 아직 잘 모르겠다 이건