일정 시간, 주기적으로 작동되는 배치 프로그램을 만들때 사용하는 라이브러리, 회사에서 서로 다른 DB의 데이터를 마이그레이션 하거나 주기별로 DB데이터를 동기화 시키는 데몬을 만들게 되어 사용방법을 정리한다.
1. 구성 요소
JobDetail : 스케줄러에서 수행할 작업을 담을 JOB을 생성, Job을 상속하는 클래스를 JobBuilder.newJob()을 이용하여 전달 해야 한다.
JobDataMap : 스케줄러에서 JOB이 실행될떄 사용할 변수 값을 전달하는데 사용한다.
key-value 형식으로 값을 전달하고 JOB을 수행할떄 값을 꺼낼수 있다.
Trigger : 스케줄러를 어떤 방식으로, 어떤 주기로 작동할 지 결정한다.
- SimpleTrigger : start time, end time, interval time, repeat times 설정
- CronTrigger : Cron 형식으로 일정 주기를 지정
Scheduler : 생성된 JOB과 Trigger를 입력하여 스케줄러를 실행한다.
2. 기본 실행 방법
스케줄러 Job 클래스 생성
Job interface를 implements 하여 execute() 메소드를 만든다.
execute() 메소드는 스케줄러가 수행할 기능을 명시한다.
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class JobTest implements Job {
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
System.out.println("## Test Job Call!!");
String name = arg0.getJobDetail().getJobDataMap().get("jobName").toString();
System.out.println("## Job Name : "+name);
}
}
스케줄러 실행 코드
JobDetail에 위에서 생성한 JobTest 클래스를 이용하여 실행될 Job을 만든다.
이때 JobDataMap을 추가로 입력하여 job 수행중에 값을 불러올 수 있도록 한다.
Trigger를 이용하여 스케줄러의 주기를 정한다.
import static org.quartz.JobBuilder.newJob;
import static org.quartz.TriggerBuilder.newTrigger;
import java.util.ArrayList;
import java.util.List;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;
public class QuartzMainTest {
public static void main(String[] args) throws SchedulerException, InterruptedException {
// TODO Auto-generated method stub
//JobDataMap은 Quartz에서 실행되는 Job에 Key-value 형식으로 값을 전달할수 있다.
JobDataMap jobDataMap = new JobDataMap();
jobDataMap.put("jobName", "HELLO");
JobDetail jobDetail = newJob(JobTest.class)
//job Data 주입
.usingJobData(jobDataMap)
.build();
Trigger trigger = newTrigger().build();
// 스케줄러 실행 및 JobDetail과 Trigger 정보로 스케줄링
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.start();
scheduler.scheduleJob(jobDetail, trigger);
}
}
예제에서는 JobDetail, Trigger에 별다른 설정을 하지 않았지만 실제 사용할때는 Job에 ID, Group 등을 입력하여 구분하거나 여러 옵션을 넣을 수 있다.
예를 들어 위에서는 JobDetail, JobDataMap를 따로 선언하여 값을 넣었지만 아래 코드처럼
JobDetail 내부의 JobDataMap을 불러오는 방식으로 변수를 넣어줄 수 있고
JobDetail jobDetail = newJob(JobTest.class).build();
//JobDetail에 JobDataMap을 불러온다.
JobDetail.getJobDataMap().put("jobName", "HELLO");
Trigger 또한 SimpleTrigger, CronTrigger로 선언 하여 여러 옵션을 줄 수 있다.
Quartz Tutorials 참고
http://www.quartz-scheduler.org/documentation/quartz-2.3.0/tutorials/tutorial-lesson-05.html
http://www.quartz-scheduler.org/documentation/quartz-2.3.0/tutorials/tutorial-lesson-06.html
import static org.quartz.TriggerBuilder.*;
import static org.quartz.CronScheduleBuilder.*;
import static org.quartz.SimpleScheduleBuilder.*;
import static org.quartz.DateBuilder.*:
CronTrigger trigger = newTrigger()
.withIdentity("ID", "group")
.withSchedule(cronSchedule("0 0/2 8-17 * * ?"))
.build();
SimpleTrigger trigger1 = (SimpleTrigger) newTrigger()
.withIdentity("trigger1", "group1")
.startAt(DateBuilder.dateOf(5, 5, 5))
.build();
'Back-end > JAVA & Spring' 카테고리의 다른 글
Quartz Job Scheduler란? (0) | 2021.05.24 |
---|---|
Spring + Quartz 주기적으로 작업 실행하기 (0) | 2021.05.24 |
[RSA] RSA MODULUS, EXPONENT (1) | 2021.05.20 |
암호화(AES, RSA, SHA) 관련 이야기 (0) | 2021.05.20 |
AES와 SHA 차이 (0) | 2021.05.20 |
댓글