티스토리 뷰
반응형
Java Quartz Scheduler
Java의 Scheduling Library를 활용해서 일정 시간마다 코드를 실행시켜보자.
Quartz
- Quartz는 다중 Thread Architecture기반
- Thread 환경 관리를 위해 ThreadPool 에 의존
- 주요 Interface
Scheduler
– scheduler 와 상호작용하는 기본 APIJob
– 실제 작업을 수행하는 개체JobDetail
– Job instances 정의에 사용Trigger
– 주어진 작업(Job)이 수행될 조건 결정 (특정시간, 횟수, 반복주기 등)JobBuilder
– Job의 instances 정의하는 JobDetail instances 빌드에 사용TriggerBuilder
– Trigger instances 빌드에 사용
Dependency
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
</dependency>
Code
코드를 따로 분리해서 설명을 작성하는 것보다 코드와 같이 주석으로 설명을 작성하는게 더 이해하기 쉬워서(본인 기준이지만..)
코드 설명은 주석을 참고하고 불필요하면 주석을 삭제해주세요 :)
TestJob.java
import java.text.SimpleDateFormat;
import java.util.Date;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class TestJob implements Job {
private static final SimpleDateFormat TIMESTAMP_FMT = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSSS");
/**
* Job interface 구현체
* Job의 trigger 실행 시 execute() Method는 scheduler의 스레드 중 하나에 의해 호출
*
* @param JobExecutionContext
* 런타임 환경에 대한 정보, 이 환경을 실행한 Scheduler에 대한 핸들, 실행을 트리거한 트리거에 대한 핸들, 작업의 JobDetail 개체 및 기타 몇 가지 항목을 작업 인스턴스에 제공
*/
@Override
public void execute(JobExecutionContext ctx) throws JobExecutionException {
System.out.println("Job Executed [" + new Date(System.currentTimeMillis()) + "]");
/**
* JobData에 접근
*/
JobDataMap dataMap = ctx.getJobDetail().getJobDataMap();
String currentDate = TIMESTAMP_FMT.format(new Date());
String triggerKey = ctx.getTrigger().getKey().toString(); // group1.trggerName
String jobSays = dataMap.getString("jobSays"); // Hello World!
float myFloatValue = dataMap.getFloat("myFloatValue"); // 3.141
System.out.println(String.format("[%s][%s] %s %s", currentDate, triggerKey, jobSays, myFloatValue));
}
}
QuartzTest.java
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
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.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
public class QuartzTest {
public static void main(String[] args) {
try {
// Scheduler 사용을 위한 인스턴스화
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
// JOB Data 객체
JobDataMap jobDataMap = new JobDataMap();
jobDataMap.put("jobSays", "Say Hello World!");
jobDataMap.put("myFloatValue", 3.1415f);
/**
* JobDetail 은 Job이 스케줄러에 추가될 때 Quartz Client에 의해 작성 (작업 인스턴스 정의)
*
* 또한 Job에 대한 다양한 속성 설정과 JobDataMap을 포함할 수 있으며,
* JobDataMap은 Job 클래스의 특정 인스턴스에 대한 상태 정보를 저장하는 데 사용
* - 작업 인스턴스가 실행될 때 사용하고자 하는 데이터 개체를 원하는 만큼 보유
* - Java Map interface를 구현한 것으로 원시 유형의 데이터를 저장하고 검색하기 위한 몇 가지 편의 방법이 추가
*/
JobDetail jobDetail = JobBuilder.newJob(TestJob.class)
.withIdentity("myJob", "group1")
.setJobData(jobDataMap)
.build();
/**
* Job의 실행을 trigger
*
* 작업을 예약하려면 트리거를 인스턴스화하고 해당 속성을 조정하여 예약 요구 사항을 구성
*
* - 특정시간 또는 특정 횟수 반복: SimpleTrigger
* - 주기적 반복: CronTrigger (초 분 시 일 월 요일 연도)
*/
// SimpleTrigger
@SuppressWarnings("deprecation")
SimpleTrigger simpleTrigger = (SimpleTrigger) TriggerBuilder.newTrigger()
.withIdentity("simple_trigger", "simple_trigger_group")
.startAt(new Date(2021 - 1900, 10, 14, 13, 0)) // 2021.11.14 오후 1시
.withSchedule(SimpleScheduleBuilder.repeatSecondlyForTotalCount(5, 10)) // 10초마다 반복하며, 최대 5회 실행
.forJob(jobDetail)
.build();
// CronTrigger
CronTrigger cronTrigger = (CronTrigger) TriggerBuilder.newTrigger()
.withIdentity("trggerName", "cron_trigger_group")
.withSchedule(CronScheduleBuilder.cronSchedule("5 * * * * ?")) // 매 5초마다 실행
// .withSchedule(CronScheduleBuilder.cronSchedule("0 0/2 8-17 * * ?")) // 매일 오전 8시에서 오후 5시 사이에 격분마다 실행
.forJob(jobDetail)
.build();
Set<Trigger> triggerSet = new HashSet<Trigger>();
triggerSet.add(simpleTrigger);
triggerSet.add(cronTrigger);
scheduler.scheduleJob(jobDetail, triggerSet, false);
scheduler.start();
} catch(Exception e) {
e.printStackTrace();
}
}
}
Result
# simple_trigger_group.simple_trigger : 2021.11.14 오후 1시 부터 매 5초마다 반복
# cron_trigger_group.trggerName : 매 5초마다 반복
[2021-11-14 13:00:00.0015][simple_trigger_group.simple_trigger] Say Hello World! 3.1415
[2021-11-14 13:00:05.0001][cron_trigger_group.trggerName] Say Hello World! 3.1415
[2021-11-14 13:00:10.0004][simple_trigger_group.simple_trigger] Say Hello World! 3.1415
[2021-11-14 13:00:20.0000][simple_trigger_group.simple_trigger] Say Hello World! 3.1415
[2021-11-14 13:00:30.0015][simple_trigger_group.simple_trigger] Say Hello World! 3.1415
[2021-11-14 13:00:40.0009][simple_trigger_group.simple_trigger] Say Hello World! 3.1415
[2021-11-14 13:01:05.0007][cron_trigger_group.trggerName] Say Hello World! 3.1415
[2021-11-14 13:02:05.0011][cron_trigger_group.trggerName] Say Hello World! 3.1415
Reference
Introduction to Quartz (baeldung)
반응형
'Web > JAVA' 카테고리의 다른 글
[JAVA] Java Code Conventions (0) | 2022.04.22 |
---|---|
[Test Code] 테스트 코드 작성의 기본기 (Introduction to AssertJ) (0) | 2022.04.18 |
[JAVA] Write a text file (텍스트 파일 쓰기) (0) | 2021.10.19 |
[JAVA] MultiThreading, 멀티스레드 (0) | 2021.10.15 |
[JavaMail API] JAVA SMTP 메일 발송하기 (0) | 2021.06.18 |
댓글