본문 바로가기
CS/Java

Quartz Scheduler 용어 정리 / 메타테이블 용도

by 쌩욱 2021. 11. 25.

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
    • 아직 잘 모르겠다 이건