[Java] Quartz로 스케줄링 하기

MinJi·2024년 10월 25일

BackEnd

목록 보기
4/6

Quartz

  • Job Scheduling 라이브러리이다.

장/단점

장점

  • DB 기반으로 스케줄러 간의 Clustering 기능을 제공한다.
  • 시스템 Fail-over와 Random 방식의 로드 분산처리를 지원한다.
  • In-memory Job Scheduler도 제공한다.
  • 여러 기본 Plug-in을 제공한다.
    • ShutdownHookPlugin: JVM 종료 이벤트를 캐치해서 스케줄러에게 종료를 알려준다.
    • LoggingJogHistoryPlugin: Job 실행에 대한 로그를 남겨 디버깅할 때 유용하다.

단점

  • Clustering 기능을 제공하지만, 단순한 random 방식이라서 완벽한 Cluster 간의 로드 분산은 안된다.
  • 어드민 UI을 제공하지 않는다.
  • 스케줄링 실행에 대한 History는 보관하지 않는다.
  • Fixed Delay 타입을 보장하지 않으므로 추가 작업이 필요하다.

관련 용어

Job

스케줄링을 통해 실행될 작업을 정의하는 인터페이스로 execute() 메소드로 실제 구현을 정의한다.

  • Job의 Trigger가 발생하면 스케줄러는 JobExecutionContext 객체를 넘겨주고 execute 메소드를 호출한다.
    • JobExecutionContext는 Scheduler, Trigger, JobDetail 등을 포함하여 Job 인스턴스에 대한 정보를 제공하는 객체이다.
public class TaskJob implements Job {
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
    }
}

JobDataMap

Job 인스턴스가 실행할 때 사용할 수 있게 원하는 정보를 담을 수 있는 객체이다.

JobDataMap jobDataMap = jobDetail.getJobDataMap();
jobDataMap.put("P_JOB_NM", jobName);
jobDataMap.put("P_TRIGGER_NM", triggerName);

JobDetail

job의 인스턴스에 대한 세부 정보를 유지한다.

  • Job 이름, 그룹, JobDataMap 속성 등을 지정할 수 있으며, Trigger가 Job을 수행할 때 이 정보를 기반으로 스케줄링을 한다.
JobDetail jobDetail = JobBuilder.newJob(TaskJob.class).withIdentity("").build();

Trigger

작업이 실행되는 주기(반복 횟수, 시작 시간 등...)를 결정하며 SimpleTrigger, Crontrigger 등 여러 트리거가 있다.

  • Trigger와 Job
    • 1 Trigger = 1 Job : 반드시 하나의 Trigger는 반드시 하나의 Job을 지정한다.
    • N Trigger = 1 Job : 하나의 Job을 여러 시간대에 실행시킬 수 있다.
  • Trigger 종류
    • SimpleTrigger : 특정 시간에 Job을 수행할 때 사용되며 반복 횟수와 실행 간격 등을 지정할 수 있다.
    • CronTrigger : cron 표현식으로 Trigger을 정의하는 방식으로 단순 반복뿐만 아니라 더 복잡한 스케줄링도 지정할 수 있다.
private Trigger buildTrigger(String postId, LocalDateTime postTime) {

    return TriggerBuilder.newTrigger()
            .withIdentity("")
            .startAt(triggerStartTime)
            .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInHours(24 * 365).withRepeatCount(1))
            .build();
}

Scheduler

job과 trigger를 사용하여 실제 작업 스케줄링을 한다.

scheduler.scheduleJob(jobDetail, trigger);

기본 로직

🔗 https://mvnrepository.com/artifact/org.quartz-scheduler/quartz

  1. Job을 만드록 Scheduler에 Job과 Job의 실행조건인 Trigger을 달아준다.
  2. 조건에 따라서 Job이 실행된다.

0개의 댓글