⏱️Quartz
1) Quartz
💡Quartz
1. Quartz는 다양한 Java 기반의 애플리케이션에 통합할 수 있는 작업 스케줄링 라이브러리이다.
2. Quartz를 사용하면 시스템에 자동화 및 효율성 향상을 이룰 수 있다.
3. ex)이메일 발송 스케줄링, 데이터베이스 백업 등에 활용 가능하다.
2) 주요 클래스 및 인터페이스
Job | 인터페이스 | 실행할 작업을 정의하는 인터페이스 |
JobDetail | 인터페이스 | 실행될 작업을 정의하고 구성하는 인터페이스 |
JobBuilder | 클래스 | JobDetail 인스턴스를 생성하는데 사용되는 유틸리티 클래스 |
JobListener | 인터페이스 | 작업의 생명 주기 동안 발생하는 이벤트를 처리하는 인터페이스 |
JobDataMap | 클래스 | 작업 실행시 필요한 데이터를 저장하는 맵 |
Trigger | 인터페이스 | 작업의 실행 시간을 결정하는 인터페이스 |
CronTriger | 인터페이스 | 복잡한 실행 스케줄을 정의할 수 있는 Trigger 인터페이스 |
TriggerBuilder | 클래스 | Trigger 인스턴스를 생성하는데 사용되는 유틸리티 클래스 |
SimpleScheduleBulider | 클래스 | 간단한 실행 스케줄을 정의할 수 있는 클래스 |
CronScheduleBuilder | 클래스 | 복잡한 실행 스케줄을 cron 표현식으로 정의할 수 있는 클래스 |
Scheduler | 인터페이스 | 작업과 트리거를 관리하고 실행하는 인터페이스 |
SchedulerFactory | 클래스 | Scheduler 인스턴스를 생성하는 클래스 |
⏱️Job
1) Job
💡Job
1. Quartz에서 실행 할 작업을 정의하는 인터페이스이다.
2. Job 인터페이스를 구현하여 실행하고자 하는 작업을 정의를 할 수 있으며
Quartz의 생명 주기에 따라 주기적으로 실행이 된다.
2) JobDetail
💡JobDetail
1. Quartz에서 실행 될 작업을 정의하는 인터페이스이다.
2. JobBuilder를 통해 구성하며 실행하려는 Job의 이름, 그룹, 클래스 타입등의 정보로 구성된다.
3) JobBuilder
💡JobBuilder
1. JobDetail 인스턴스를 생성하는데 사용되는 유틸리티 클래스이다.
2. JobDetail 객체를 생성하고 작업의 이름, 그룹, 클래스 타입 등의 세부 정보를 설정할 수 있다.
💡JobBuilder 사용예시
JobDetail jobDetail = JobBuilder
.newJob(SimpleJob.class) // Job의 구현 클래스 설정
.withIdentity("simpleJob", "group1") // Job의 identity 설정
.withDescription("This is simple job") // Job의 설명 설정
.ofType(SimpleJob.class) // Job의 구현 클래스 설정
.requestRecovery(true) // Job이 실패한 경우 다시 실행하도록 설정
.storeDurably(true) // Job이 지속적으로 저장되도록 설정
.usingJobData("key", "value") // Job의 data map 설정
.build(); // 설정된 정보를 바탕으로 JobDetail 인스턴스 생성
4) JobListener
💡JobListener
1. Spring Batch에서 제공하는 인터페이스로 배치 **작업의 생명주기 동안 발생하는 이벤트를 처리**.
구현함으로써 배치 작업이 시작되거나 완료될 때마다 특정 작업을 수행하도록 할 수 있다.
2. ex)작업이 시작될 때 데이터베이스에 로그를 기록하거나,
작업이 완료된 후에 이메일 알림을 보내는 등의 작업을 수행할 수 있다.
이러한 기능은 문제가 발생했을 때 즉시 알아차릴 수 있도록 돕는다.
5) JobDataMap
💡JobDataMap
1. Quartz 스케줄러에서 Job의 상태 데이터를 관리하는 데 사용되는 클래스이다.
2. JobDataMap는 Map 인터페이스를 확장한 것이다.
💡JobDataMap 사용예시
JobDataMap jobDataMap = new JobDataMap();
jobDataMap.put("key", "value");
JobDetail job = JobBuilder
.newJob(HelloJob.class) // Job 구현 클래스
.withIdentity("helloJob", "helloGroup") // Job 이름, 그룹 지정
.withDescription("hello에 대한 조회 Job") // Job 설명
.setJobData(jobDataMap)
.build();
⏱️Trigger
1) Trigger
💡 Trigger
1. Quartz의 Trigger는 스케줄링 작업의 실행 시간을 결정하는 역할을 한다.
Trigger는 간단히 말해 작업이 언제 실행될지를 정의하는 것이다.
2. 스케줄러에서 사용되는 Trigger는 SimpleTrigger와 CronTrigger로 나뉜다.
3. SimpleTrigger는 Trigger로 인스턴스화 해야한다.
SimpleTrigger는 간단한 실행 스케줄을 정의할 수 있는 Trigger 인터페이스이다.
4. CronTrigger는 Trigger 혹은 CronTrigger로 인스턴스화 해야한다.
CronTrigger는 복잡한 실행 스케줄을 정의할 수 있는 Trigger 인터페이스이다.
2) SimpleTrigger & CronTrigger
💡 SimpleScheduleBuilder 사용예시
Trigger simpleTrigger = TriggerBuilder
.newTrigger()
.withIdentity("SimpleTrigger", "group1")
.startNow()
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(10)
.repeatForever())
.build();
💡 CronScheduleBuilder 사용예시
Trigger cronTrigger = TriggerBuilder
.newTrigger()
.withIdentity("CronTrigger", "CronGroup") // Trigger 이름, 그룹 지정
.withDescription("Cron Trigger") // Trigger 설명
.startNow()
.withSchedule(
CronScheduleBuilder
.cronSchedule("0/10 * * * ?")
)
.build();
[Cron 표현식]
⏱️Scheduler
1) Scheduler
💡 Scheduler
1. Scheduler는 StdSchedulerFactory를 통해 스케줄러를 가져와서 Scheduler Job을 구성한다.
또한 Job의 생명주기를 관리하는 JobListener를 등록할 수 있다.
2. Scheduler Job에는 Job과 Trigger가 등록이 된다.
3. 여러 작업(Job)을 관리하고 이들을 트리거(Trigger)에 따라 실행한다.
2) StdSchedulerFactory
💡 StdSchedulerFactory
1. StdSchedulerFactory는 Scheduler 인스턴스를 생성하고 초기화하는 역할을 한다.
2. 설정 파일이나 직접 전달된 Properties 객체를 이용해 스케줄러를 설정할 수 있다.
또한, 스케줄러가 사용하는 스레드 풀, JobStore 등의 구성 요소를 관리하고 설정한다.
⏱️Quartz를 실제로 구현해보기
1) 패키지 구조
2) 의존성 주입
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-quartz'
}
3) 스레드 풀 설정(application.properties)
4) SchedulerConfig
5) Job Config
package com.example.test.quartz_test.config;
import com.example.test.quartz_test.job.CronJob;
import com.example.test.quartz_test.job.SimpleJob;
import jakarta.annotation.PostConstruct;
import lombok.RequiredArgsConstructor;
import org.quartz.*;
import org.springframework.context.annotation.Configuration;
/*
* - Scheduler.scheduleJob() 메소드 -
* 주어진 JobDetail을 스케줄러에 추가하고, 주어진 Trigger와 연결.
* */
@Configuration
@RequiredArgsConstructor
public class JobConfig {
private final Scheduler scheduler;
@PostConstruct
public void scheduleJobs() throws SchedulerException {
scheduleCronJob();
scheduleSimpleJob();
}
// Cron
public void scheduleCronJob() throws SchedulerException {
//JobDetail
JobDetail cronJobDetail = JobBuilder
.newJob(CronJob.class) // Job 클래스
.withIdentity("cronJob", "cron") // Job 이름, 그룹 지정
.withDescription("cron Job test") // Job 설명
.build();
//CronTrigger
CronTrigger cronTrigger = TriggerBuilder
.newTrigger()
.withIdentity("cronTrigger", "cron") // Triggger 이름, 그룹 지정
.withDescription("cron Job Test") // Triggger 설명
.startNow()
.withSchedule(CronScheduleBuilder.cronSchedule("0/10 * * * * ?")) // 10초마다 실행
.build();
//스케줄러에 JobDetail & Trigger 등록
scheduler.scheduleJob(cronJobDetail, cronTrigger);
}
// Simple
public void scheduleSimpleJob() throws SchedulerException {
//JobDetail
JobDetail simpleJobDetail = JobBuilder
.newJob(SimpleJob.class)
.withIdentity("simpleJob", "simple")
.withDescription("simple job test")
.build();
//SimpleTrigger
SimpleTrigger simpleTrigger = TriggerBuilder
.newTrigger()
.withIdentity("simpleTrigger", "simple")
.withDescription("cron Job Test")
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(30) // 30초마다 실행
.repeatForever())
.build();
// 스케줄러에 JobDetail과 Trigger 등록
scheduler.scheduleJob(simpleJobDetail, simpleTrigger);
}
}
6) JobListener
7) ListenerConfig
8) Job
⏱️요약 정리
Job | 스케줄링 할 작업을 정의한다. |
JobDetail | Job의 이름, 그룹 등의 다양한 정보를 넣을 수 있다. |
JobListener | 작업 완료 후에 DB에 log를 기록하거나 알림을 보내는 등의 작업을 수행한다. |
Trigger | 스케줄링이 언제 실행될지 정의하는 것. |
SimpleTrigger | 간단한 실행 스케줄을 정의할 수 있는 Trigger 인터페이스이다. |
CronTrigger | 복잡한 실행 스케줄을 정의할 수 있는 Trigger 인터페이스이다. |
Scheduler | 등록된 Job을 관리하고 이 Job들을 Trigger에 맞게 실행한다. |
SchedulerFactoryBean | 스케줄러의 생명주기를 자동으로 관리해준다. |
1. Scheduler를 Bean으로 스프링 컨테이너에 등록 한다.
2. JobConfig class에서 JobDetail & Trigger 생성 후 Scheduler에 등록 한다.
3. Scheduler 실행 후 찍을 log를 위해 JobListener 정의 한다.
4. 정의한 JobListener를 Scheduler에 등록 한다.
5. Job을 구현중인 class에 스케줄러 실행시 동작 할 로직을 정의 한다.
'Java' 카테고리의 다른 글
[Java] 자료구조 HashMap의 특징 및 핵심 원리 (0) | 2024.09.18 |
---|---|
[Java] 자바 접근제어자(public, protected, default, private) (1) | 2024.09.16 |
[Java] enum(열거 타입)에 대해서 (0) | 2024.08.18 |
[Java] JSON 객체 다루기(JSONObject, JSONArray) (0) | 2024.08.02 |
[Java] ArrayList 내부 구조 파헤치기(크기, 메모리 구조, 내부 동작 과정) (0) | 2024.07.30 |