Framework/Spring-Quartz
(2) Spring Scheduler vs Quartz
by 조훙
2022. 11. 24.
Spring Scheduler
- Spring에 통합된 Scheduler
- 별도의 구성 없이 Spring Boot Starter 에 포함되어 있음
- Annotation 형태로 쉽게 사용 가능
- 별도의 Schedule 을 변경하거나, 별도의 Clustering 기능 부재
- 간단한 Schedule 형태에 적용 가능
- Scheduler method 반드시 void 형으로 지정 해야
- method는 별도의 파라미터를 지정 할 수 없다.
- Main Thread에 통합 수행되어 하나의 작업이 완료 된 이후 다음 작업이 수행 된다.
Code 예시
@EnableScheduling // Annotation 설정으로 초기 구성 완료
@SpringBootApplication
public class Application() {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
public class Scheculer() {
@Scheduled(fixedDelay = 1000) // scheduler 끝나는 시간 기준으로 1000 간격으로 실행
public void scheduleFixedDelayTask() {
System.out.println(
"Fixed delay task - " + System.currentTimeMillis() / 1000);
}
@Scheduled(fixedRate = 1000) // scheduler 시작하는 시간 기준으로 1000 간격으로 실행
public void scheduleFixedRateTask() {
System.out.println(
"Fixed rate task - " + System.currentTimeMillis() / 1000);
}
@Scheduled(cron = "0 15 10 15 * ?") // cron에 따라 실행
public void scheduleTaskUsingCronExpression() {
long now = System.currentTimeMillis() / 1000;
System.out.println(
"schedule tasks using cron jobs - " + now);
}
@Scheduled(cron = "0 15 10 15 * ?", zone = "Europe/Paris") // cron에 TimeZone 설정 추가
}
Quartz
- Java 내부의 별도 Thread 지정하여 수행 가능
- Scheduler 간의 Clustering 지원
- Scheduling 실패 후 처리 방법 등을 정의 가능(Misfire Instruction)
- JVM 종료 이벤트 캐치 기능 제공
- 다양한 Plugin 제공
public class DumbJob implements Job {
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("DumbJob is executing.");
}
}
JobDetail jobDetail = new JobDetail("myJob",// Job 명
sched.DEFAULT_GROUP, // Job 그룹명('null' 값인 경우 DEFAULT_GROUP 으로 정의됨)
DumbJob.class); // 실행할 Job 클래스
Trigger trigger = TriggerUtils.makeDailyTrigger(8, 30); // 매일 08시 30분 실행
trigger.setStartTime(new Date()); // 즉시 시작
trigger.setName("myTrigger");
sched.scheduleJob(jobDetail, trigger);
Reference
https://pray-for-dev.tistory.com/45