Quartz란?

Quartz는 자바기반의 스케줄러 라이브러리 입니다. 일정한 주기의 Job을 실행하기 위해 Jenkins 혹은 Quartz 등을 사용하는데 Jenkins에 비교하여 좀 더 세밀한 스케줄링이 필요하거나 비즈니스 로직에 의하여 Job이 실행될 수 있다는 특징이 있습니다. Quartz 웹 바로가기

Quartz의 구조

Quartz는 모듈식 아키텍쳐를 사용하여 필요에 따라 조합할 수 있는 Scheduler, Trigger, Job 등의 요소들로 구성됩니다. 간단하게 설명하면 Scheduler가 언제, 어떤주기로, 언제까지 실행할 지를 나타내는 Trigger를 이용해서 JobDetail에 구현된 Job의 제반정보를 실행합니다.
기본적으로는 인메모리 JobStore가 사용되는데 spring.quartz.job-store-type = jdbc 설정을 하면 JDBC 저장소를 구성할 수 있습니다.

설정에 대한 설명은 아래 링크에 있습니다. 링크

No Image

  • Scheduler : 작업 스케줄링, 스케줄 추가, 제거 등 을 위한 기본 API
  • Job : 작업을 작성하는 곳인 excute()라는 단일 메서드를 가지는 인터페이스. 작업을 나타내는 클래스에 의해 구현되어집니다.
  • JobDetail : 작업의 인스턴스를 정의하며 작업이 실행될 때 작업에 전달되는 JobDataMap의 형태로 데이터를 포함합니다. 모든 JobDetail은 고유한 이름과 그룹으로 구성된 JobKey 로 식별됩니다.
  • Trigger : 주어진 작업이 실행될 일정을 정의하는 구성 요소로 Job에는 여러개가 Trigger가 있을 수 있지만 Trigger는 하나의 Job에만 연관될 수 있습니다.
  • JobBuilder : Job의 인스턴스를 정의하는 JobDetail 인스턴스를 정의, 빌드하는 데 사용됩니다.
  • TriggerBuilder : 트리거 인스턴스를 정의, 빌드하는 데 사용됩니다.

    참고 링크

Spring Boot에서 시작하기

Spring Boot에서는 spring-boot-starter-quartz 를 통해 간단하게 Quartz를 사용할 수 있습니다. 간단하게 로그를 찍어보는 예제코드를 만들어 보겠습니다.

  • 의존성 추가
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
  • HelloJob 코드
package com.sy.helloquartz;

import lombok.extern.slf4j.Slf4j;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

@Slf4j
public class HelloJob implements Job {

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException{
        //JobExcutionContext에서 정보를 가져옴
        log.info("Job ** {} ** fired @ {}", context.getJobDetail().getKey().getName(), context.getFireTime());
        log.info("### Hello ###");
        log.info("Next job scheduled @ {}", context.getNextFireTime());
    }
}
  • 실행 코드
SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory();
Scheduler sched = schedFact.getScheduler();
sched.start();

// HelloJob 클래스로 job 정의
JobDetail job = newJob(HelloJob.class)
    .withIdentity("myJob", "group1")
    //.usingJobData(jobDataMap) jobDataMap 주입 가능
    .build();

// Trigger 생성
Trigger trigger = newTrigger()
    .withIdentity("myTrigger", "group1")
    .startNow()
    .withSchedule(simpleSchedule()
        .withIntervalInSeconds(40)
        .repeatForever())
    .build();

//스케쥴러에 Trigger를 사용하는 Job 등록
sched.scheduleJob(job, trigger);
  • 결과
    2019-01-31 09:23:08.091  INFO 5514 --- [           main] org.quartz.impl.StdSchedulerFactory      : Quartz scheduler version: 2.3.0
    2019-01-31 09:23:08.091  INFO 5514 --- [           main] org.quartz.core.QuartzScheduler          : Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.
    2019-01-31 09:23:08.101  INFO 5514 --- [eduler_Worker-1] com.sy.helloquartz.HelloJob              : Job ** myJob ** fired @ Thu Jan 31 09:23:08 KST 2019