java

java Quartz Scheduler 사용기록

fd27 2021. 3. 23. 11:25

자바로 스케줄링 프로그램을 만들어 사용해 볼 기회가 있어 기록을 남긴다.

quartz 라이브러리 등록

 <dependency>
     <groupId>org.quartz-scheduler</groupId>
     <artifactId>quartz</artifactId>
     <version>2.3.2</version>
 </dependency>

SchedulerHelper 클래스 제작

1. SchedulerHepler 클래스는 생성자를 통해 Quartz 라이브러리에 있는 Scheduler 클래스를 생성
2. addScheduleJob 메소드를 통해 수행할 Job 클래스와 Job 클래스를 실행할 Cron 시간, Job 클래스에 전달할 매개변수를 Scheduler에 추가
3. startScheduler 메소드를 사용하여 추가된 Job을 실행

 

package fd27.quartz.helper;

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

public class ScheduleHelper {
    private final Scheduler scheduler;

    public ScheduleHelper() throws SchedulerException {
        scheduler = StdSchedulerFactory.getDefaultScheduler();
    }

    public void addScheduleJob(String cron, Class<? extends Job> jobClass, String data) throws SchedulerException {
        JobDetail jobDetail = JobBuilder
                .newJob(jobClass)
                .usingJobData("data", data)
                .build();

        Trigger trigger = TriggerBuilder.newTrigger()
                .withSchedule(CronScheduleBuilder.cronSchedule(cron))
                .build();

        scheduler.scheduleJob(jobDetail, trigger);
    }

    public void startScheduler() throws SchedulerException {
        scheduler.start();
    }
}

실행될 두 개의 Job 클래스 제작

Hello를 출력하는 Job 클래스와 World를 출력하는 Job 클래스

package fd27.quartz.job;

import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

import java.sql.Timestamp;

public class PrintHelloJob implements Job {

    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        JobDataMap jobDataMap = jobExecutionContext.getJobDetail().getJobDataMap();
        Timestamp timestamp = new Timestamp(System.currentTimeMillis());
        String data = jobDataMap.getString("data");
        String message = timestamp + ", Hello Job, " + data + ", 스케줄링이 실행됩니다.";
        System.out.println(message);
    }
}
package fd27.quartz.job;

import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

import java.sql.Timestamp;

public class PrintWorldJob implements Job {

    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        JobDataMap jobDataMap = jobExecutionContext.getJobDetail().getJobDataMap();
        Timestamp timestamp = new Timestamp(System.currentTimeMillis());
        String data = jobDataMap.getString("data");
        String message = timestamp.toString() + ", World Job, " + data + ", 스케줄링이 실행됩니다.";
        System.out.println(message);
    }
}

스캐줄링 실행 테스트

SchedulerHelper 클래스를 통해 PrintHelloJobPrintWorldJob를 실행

package fd27;

import fd27.quartz.helper.ScheduleHelper;
import fd27.quartz.job.PrintHelloJob;
import fd27.quartz.job.PrintWorldJob;
import org.quartz.SchedulerException;

public class Main {
    public static void main(String[] args) throws SchedulerException {
        ScheduleHelper scheduleHelper = new ScheduleHelper();
        scheduleHelper.addScheduleJob("0/5 * * * * ?", PrintHelloJob.class, "전달 데이터1");
        scheduleHelper.addScheduleJob("0/10 * * * * ?", PrintHelloJob.class, "전달 데이터2");
        scheduleHelper.addScheduleJob("0/15 * * * * ?", PrintWorldJob.class, "전달 데이터1");
        scheduleHelper.addScheduleJob("0/20 * * * * ?", PrintWorldJob.class, "전달 데이터2");
        scheduleHelper.startScheduler();
    }
}

출력

2021-03-23 11:17:40.016, World Job, 전달 데이터2, 스케줄링이 실행됩니다.
2021-03-23 11:17:40.017, Hello Job, 전달 데이터2, 스케줄링이 실행됩니다.
2021-03-23 11:17:40.017, Hello Job, 전달 데이터1, 스케줄링이 실행됩니다.
2021-03-23 11:17:45.004, Hello Job, 전달 데이터1, 스케줄링이 실행됩니다.
2021-03-23 11:17:45.004, World Job, 전달 데이터1, 스케줄링이 실행됩니다.
2021-03-23 11:17:50.009, Hello Job, 전달 데이터2, 스케줄링이 실행됩니다.
2021-03-23 11:17:50.009, Hello Job, 전달 데이터1, 스케줄링이 실행됩니다.
2021-03-23 11:17:55.016, Hello Job, 전달 데이터1, 스케줄링이 실행됩니다.
2021-03-23 11:18:00.012, World Job, 전달 데이터2, 스케줄링이 실행됩니다.
2021-03-23 11:18:00.012, Hello Job, 전달 데이터2, 스케줄링이 실행됩니다.
2021-03-23 11:18:00.013, Hello Job, 전달 데이터1, 스케줄링이 실행됩니다.
2021-03-23 11:18:00.013, World Job, 전달 데이터1, 스케줄링이 실행됩니다.
2021-03-23 11:18:05.0, Hello Job, 전달 데이터1, 스케줄링이 실행됩니다.
2021-03-23 11:18:10.003, Hello Job, 전달 데이터2, 스케줄링이 실행됩니다.
2021-03-23 11:18:10.004, Hello Job, 전달 데이터1, 스케줄링이 실행됩니다.
2021-03-23 11:18:15.01, Hello Job, 전달 데이터1, 스케줄링이 실행됩니다.
2021-03-23 11:18:15.01, World Job, 전달 데이터1, 스케줄링이 실행됩니다.