Lang/Java

Quartz 간단하게 사용법

hamaganatanadda 2023. 2. 18. 19:25

version: quartz-2.3.2

 

다양한 방법이 있어서 종합 

SimpleTrigger, CronTrigger 등록 방법
Job이 실행되는 주기
동시성
다음 작업 시간 확인
지난 Job 삭제 

파라미터 넘기기

 

추가필요

Job 중지

 

 

package javaTest;

import java.util.Date;

import org.quartz.CronExpression;
import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.SimpleTrigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

public class QuartzTestMain {
  public static void main(String[] args) throws Exception{
    SchedulerFactory schedulerFactory = new StdSchedulerFactory();
    Scheduler scheduler = schedulerFactory.getScheduler();
//  or
//  Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

//  import static org.quartz.JobBuilder.newJob; -> newJob 가능
    JobDetail jobDetail = JobBuilder.newJob(JobTest.class)
          .withIdentity("job", "group1")
          .usingJobData("value1", "param1")
          .build();

//      파라미터 넘기기: usingJobData 또는 JobDataMap
//      JobDataMap jobDataMap = jobDetail.getJobDataMap();
//      jobDataMap.put("value2", "param2");

//      withSchedule 방법
//      1. SimpleScheduleBuilder.repeatMinutelyForever(1)
//      2. import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
//      simpleSchedule().withIntervalInMinutes(1).repeatForever()

//      Trigger trigger = TriggerBuilder.newTrigger() 로 가능

//      import static org.quartz.TriggerBuilder.newTrigger; -> newTrigger 가능
        SimpleTrigger simpleTrigger = (SimpleTrigger) TriggerBuilder.newTrigger()
                .withIdentity("simpleTrigger", "group1")
                .withPriority(1) //리소스가 충분하지 않아 동시에 시작할지 못 할때 우선순위
                .startNow() //시작시간 정하기
                .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(40).repeatForever()) //반복주기, count
                .build();
        //40초마다 동작 되는 시간 예시
        //00:00:40 - 00:01:20 - 00:02:00

//      import static org.quartz.CronScheduleBuilder.cronSchedule; -> cronSchedule로 사용 가능
        String exp = "*/40 * * * * ?";
        CronTrigger cronTrigger = (CronTrigger) TriggerBuilder.newTrigger()
              .withIdentity("cronTrigger", "group1")
              .withSchedule(CronScheduleBuilder.cronSchedule(exp))
              .build();

//      다음 작업 시간 확인
        CronExpression cronExpression = new CronExpression(exp);
        Date d1 = cronExpression.getNextValidTimeAfter(new Date());
        Date d2 = cronExpression.getNextValidTimeAfter(d1);

//      "0/40 * * * * ?" = "*/40 * * * * ?"
//      매분마다 시작 후 40초
//      00:00:40 - 00:01:00 - 00:01:40 - 00:02:00
//      "40 * * * * ?"
//      매분 40초
//      00:00:40 - 00:01:40 - 00:02:40 - 00:03:40

        scheduler.scheduleJob(jobDetail, simpleTrigger);

        scheduler.start();

    }
}

 

 

package javaTest;

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

//@DisallowConcurrentExecution 동시에 실행 방지
//예시: 5초마다 반복하는 Job이 최초만 7초 걸릴 경우
//사용: 00:00:00 -> 00:00:07(5초 작업이 대기열에 있다가 실행) -> 00:00:10
//미사용: 00:00:00 -> 동작 중에 00:00:05에 실행이 됨
@DisallowConcurrentExecution
public class JobTest implements Job{

  @Override
  public void execute(JobExecutionContext context) throws JobExecutionException {
    //파라미터 받기
    JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
    System.out.println(jobDataMap.getString("value1"));
  }
}

quartz.properties 파일 설정

project 안에 생성(순수 JAVA기준)

없다면 org.quartz 패키지 안의 quartz.properties을 따라감

# 동시에 실행할 수 있는 Job Thread 개수
# 예시: Job2개 등록 시 1개씩만 실행가능
org.quartz.threadPool.threadCount: 1

# 대기 중인 Job 삭제 시간(ms)
# 예시: 1초마다 반복하는 Job이 최초만 7초 걸릴 경우
# 첫 번재 Job이 동작중인 상태에서 1초마다 대기열에 등록 되고 3초가 지난 대기열은 삭제
org.quartz.jobStore.misfireThreshold: 3000

 

Job 강제 실행(테스트 시 사용)

실행중인 Job에는 영향이 없는 것으로 보이긴하지만 테스트 필요

https://stackoverflow.com/questions/7039303/firing-quartz-jobs-manually

 

Firing Quartz jobs manually

We have several Quartz jobs configured in our application. During development, we leave the quartz scheduler in standby - however, we sometimes want to start a job manually (for development purpose...

stackoverflow.com

 

우선 참고 링크
https://www.baeldung.com/quartz
http://www.quartz-scheduler.org/documentation/2.4.0-SNAPSHOT/index.html#quartz-developers-guide

 

Quartz Documentation

If you don’t find what you’re looking for in the docs, post a question to the Quartz support forums.

www.quartz-scheduler.org

http://www.cronmaker.com/

 

CronMaker

 

www.cronmaker.com

 

'Lang > Java' 카테고리의 다른 글

밀리세컨드 범위 동적으로 사용  (0) 2023.05.07
LocalDateTime millisecond 계산  (0) 2023.04.01
Java ArrayList, Map multiThread  (0) 2023.02.12
Thread Runnable 사용 시 setName  (0) 2023.02.11
sts thymeleaf ',' expected Language Servers  (0) 2022.11.20