mingg IT

[Java] Quartz 스케줄러 사용법 본문

기타

[Java] Quartz 스케줄러 사용법

mingg123 2021. 8. 23. 21:42

http://www.quartz-scheduler.org/documentation/quartz-2.3.0/tutorials/tutorial-lesson-06.html

 

Tutorial 6

Lesson 6: CronTrigger CronTrigger is often more useful than SimpleTrigger, if you need a job-firing schedule that recurs based on calendar-like notions, rather than on the exactly specified intervals of SimpleTrigger. With CronTrigger, you can specify firi

www.quartz-scheduler.org

내가 원하는 지정된 시간 즉 주기적으로 배치 프로그램을 만들때 사용하는 라이브러리이며 은행에서 매달 이용내역을 청구하듯이 분기별로 DB의 데이터를 동기화 하는데 사용한다. 

 

이슈로 스케쥴러를 만들때 설정해놓은 시작시간과 다르게 스케줄러가 도는 부분을 수정하다가 해당 라이브러리를 공부해보기로 했다. 

 

Quartz API 주요 인터페이스

  • Scheduler - 스케줄러와 상호 작용하기 위한 기본 API입니다.
  • Job - 스케줄러에 의해 실행되기를 원하는 구성 요소에 의해 구현될 인터페이스입니다.
  • JobDetail - 작업의 인스턴스를 정의하는 데 사용됩니다.
  • Trigger - 주어진 작업이 실행될 일정을 정의하는 구성 요소입니다.
  • JobBuilder - 작업의 인스턴스를 정의하는 JobDetail 인스턴스를 정의/구축하는 데 사용됩니다.
  • TriggerBuilder - Trigger 인스턴스를 정의/구축하는 데 사용됩니다.

 

1. 스케줄러 생성

JobDataMap을 이용하여 Job Detail을 만든다. 

JobDataMap 내부에는

name : 스케줄러이름

groupName : 그룹 이름 

description : 설명

seheduleInfo : 스케줄러에 대한 정보가 들어 있는 map (key - value) 로 이루어져있음

예를들어 (startTime - 2021.08.23 00:00:00) 이런식으로

 

withIdentity("myJob", "group1") // 스케줄러이름 myJob, 그룹 group1이라는 의미 

private JobDetail buildSechduler(Class job, Integer name, String groupName, String description,
      Map seheduleInfo) {

    JobDataMap jobDataMap = new JobDataMap();
    jobDataMap.putAll(seheduleInfo);
    return JobBuilder.newJob(job).withIdentity(Integer.toString(name), groupName)
        .withDescription(description).usingJobData(jobDataMap).build();
  }

 

2.트리거를 선택함. 

startTime : 2021.08.23 21:09:00

Hour : 10

Min : 30

매일 10: 30 분에 스케줄러가 수행된다. 

 

HolidayCalendar cal = new HolidayCalendar();

cal.addExcludedDate( someDate );

cal.addExcludedDate( someOtherDate );

sched.addCalendar("myHolidays", cal, false);

 

.modifiedByCalendar("myHolidays")

를 사용하면 공휴일은 돌지않도록 할 수 있다.  (org.quartz.impl.HolidayCalendar 클래스 사용)

private Trigger SimpleJobTrigger(String scheduleExp, Integer Hour, Integer Min) {
    return TriggerBuilder.newTrigger().startAt(startTime).withSchedule(SimpleSchedule.withSchedule(dailyAtHourAndMinute(Hour, Min))
        .build();
  }

 

cron 을 사용한 스케줄러

startTime : 2021.08.23 21:09:00 

sehcduleExp : 0 0/5 * * * ? 

5분마다 작동한다.

스케줄러가 동작하는 시작 시간을 설정하고 싶을경우 startAt을 사용한다. 

startAt을 사용해주지 않으면 처음 만들어진 순간부터 sehcduleExp 에맞게 스케줄러를 수행한다.

private Trigger CronJobTrigger(String scheduleExp, Timestamp startTime) {
    return TriggerBuilder.newTrigger().startAt(startTime).withSchedule(CronScheduleBuilder.cronSchedule(scheduleExp))
        .build();
  }
Comments