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
우선 참고 링크
https://www.baeldung.com/quartz
http://www.quartz-scheduler.org/documentation/2.4.0-SNAPSHOT/index.html#quartz-developers-guide
'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 |