Java

쿼츠 스케줄러

주노오 2022. 6. 28. 09:56
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에도 저장할 수 있다. 실제 구현은 아래 링크 참조

  - RedisJobStore

  - MongoDBJobStore

 

 

출처 : https://advenoh.tistory.com/51