티스토리 뷰

Quartz

Quartz는 미리 결정된 시간 또는 예약된 시간에 작업을 예약하고 실행하는데 사용할 수 있는데 오픈 소스 라이브러리이다. 간단한 interval , Cront 표현식을 사용하여 작업할 수 있다.

장점

  • in-Memory, JDBC 방식 제공
  • 스케줄러 간 클러스터링
  • 시스템 Fail-over(Random 방식의 로드 분산처리)
  • 기본 플러그인 제공(ShutdownHookPlugin, LoggingHistoryPlugin)

단점

  • 완벽한 로드 분산처리 불가(Random 방식)
  • GUI 환경 미지원
  • 스케줄러 실행에 대한 히스토리 보관 미지원
  • fixed delay 미지원

 

Quartz Maven Dependency

<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz -->
<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.3.2</version>
</dependency>

Quartz Gradle Dependency

// https://mvnrepository.com/artifact/org.quartz-scheduler/quartz
implementation 'org.quartz-scheduler:quartz:2.3.2'

 

1. Quartz

Scheduler

- 스케줄러 관리

Job

- 스케줄러에 의해 실행

JobDataMap

- Job을 동작시키는데 필요한 Parameter 정보

JobDetail

- Job을 실행하기 위핸 실행 정보(그룹, 이름, JobDataMap)

Trigger

- Job 실행 조건
- Job(1) = Trigger(N) 구조 가능
- SimpleTrigger :  반복 횟수( 카운트 + 1 수행), 반복 간격(ms)
- CronTrigger : Cron 표현식

 

2. 공통 속성

모든 트리거 유형에는 추적하기 위한 키 속성이 있다. 그 외에도 공통적인 트리거 속성은 아래와 같다.

  • jobKey : 트리거가 실행되는 작업ID
  • startTime : 트리거의 일정이 처음 적용되는 시간
  • endTime : 트리거의 일정이 더 이상 적용되지 않는 시간

Priority(우선순위)

  • 트리거가 많이 있거나 트리거를 체크하는 워크스레드가 부족한 경우 Quartz가 같은 시간에 지정된 모든 트리거를 실행이 불가한 경우, priority 속성을 통해 지정할 수 있다. (디폴트 5)
  • 트리거의 실행 시간이 동일한 경우에만 우선순위 비교
  • 트리거의 작업이 복구 시 원래 트리거와 동일한 우선순위로 설정

Misfire(불발)

  • 불발 시 Job이 실행되어야 하는 시간을 의미
  • 스케줄러가 다운되어 작동하지 못할 때, 스레드 풀에 사용 가능한 스레드가 없는 경우 발생

 

3. SimpleTrigger

  • 작업을 특정 시점에 정확히 한번 실행하거나 특정 시점에 특정 간격으로 반복해서 실행하는 경우에 사용
  • 시작 시간, 종료 시간, 반복 횟수, 반복 간격이 포함
  • 반복 횟수는 0 또는 양의 정수
  • 반복 간격은 milliseconds

 

4. CronTrigger

필드 필수 허용 특수문자
초(Seconds) Y 0 ~ 59 , - * / 
분(Minutes) Y 0 ~ 59 , - * /
시(Hours) Y 0 ~ 23 , - * / 
일(Day-of-Month) Y 1 ~ 31 , - * / ? L W
월(Month) Y 0 ~ 11 or JAN ~ DEC , - * /
요일(Day-of-Week) Y 1 ~ 7 or SUN ~ SAT , - * / ? L #
년(Year) N empty or 1979 ~ 2099 , - * /
  • '*' 모든 값 의미(매일, 매월, 매주 등)
  • '?' 특정 값이 없음을 의미(일, 요일에서 사용가능)
  • '-' 범위를 의미(MON-WED 값은 월요일에서 수요일)
  • ',' 여러 개의 값을 의미(MON, WED, FRI 값은 월, 수, 금)
  • '/' 증분을 의미, 분이라고 할 때 3/20 - 20분마다 3분에 시작을 의미 (3, 23, 43)
  • 'L' 일 및 요일 필드에 허용되며 마지막을 의미 (마지막 일, 마지막 주)
  • 'W' 주어진 요일에 가장 가까운 평일을 지정하는데 사용 (15W 값은 매월 15일에서 가장 가까운 평일)
  • '#' 해당 월의 n번째 요일을 지정하는데 사용 (6#3 또는 FRI#3 값은 매월 3번째 금요일)
  • 일 1~31의 값이 될 수 있지만 주어진 달이 며칠인지 주의 필요
Cron 표현식 설명
0 0/5 * * * ? 5분 마다 실행
0 0 12 * * ? 매일 12시에 실행
10 0/5 * * * ? 10초를 기점으로 5분 마다 실행(10:00:10, 10:05:10 ...)
0 30 10-13 ? * WED,FRI 매주 수요일, 금요일 10~13시 30분에 실행(10:30, 11:30, 12:30, 13:30)
0 0/30 8-9 5,20 * ? 매월 5,20일에 8~9시 30분 마다 실행(8:30, 9:00, 9:30)
0 0 12 ? * WED 매주 수요일 12시에 실행

Cron Maker를 이용하여 표현식을 공부하거나, 검증하는데 사용하면 좋다

http://www.cronmaker.com/

 

CronMaker

 

www.cronmaker.com

 

5. SchedulerListeners

스케줄러 자체 내에서 이벤트에 대한 알림을 수신(작업/트리거 추가, 제거, 오류, 종료 등)

 

6. Job Stores

  • RAM JobStore : 손쉬운 사용과 성능이 우수하지만 종료 시 모든 스케줄 정보가 유실(휘발성)
  • JDBC JobStore : JDBC를 통해 스케줄 정보를 데이터베이스에 보관이 가능하지만, RAMJobStore에 비해 구성이 복잡하고 빠르지 않다. (Quartz가 사용할 DataSource 이름 지정 필요)

 

7. Clustering

JDBC JobStore에서만 클러스터링 지원(부하 분산 및 작업 장애 조치)

 

8. Quartz Table

QRTZ_LOCKS : 작업 실행 인스턴스

QRTZ_JOB_DETAILS : 실행될 Job 정보(이름, 그룹, 클래스 등)
QRTZ_TRIGGERS : Job을 실행할 스케줄 Trigger 정보(Trigger 종류 구분 및 시간)

QRTZ_CRON_TRIGGERS : Cron Trigger 정보(Cron Expression, Time Zone)
QRTZ_SIMPLE_TRIGGERS : Simple Trigger 정보(반복 횟수, 간격)
QRTZ_CALENDARS : 달력 형태 스케줄러 정보(특정 범위에 스케줄을 동작시키지 않을 때 사용)

QRTZ_SCHEDULER_STATE : 스케줄러 상태 확인(LAST_CHECKIN_TIME이 CHECKIN_INTERVAL 간격으로 갱신)
QRTZ_FIRED_TRIGGERS : 실행된 Trigger 정보
QRTZ_PAUSED_TRIGGER_GRPS : 정지된 Trigger 정보

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함