코딩마을방범대
Java Quartz를 이용해 동적 스케줄링 설정하기 본문
728x90
위의 방법대로 @Scheduled를 이용해 반복적인 작업을 수행하는 경우가 있다.
그러나 이 경우엔 cron의 반복 주기를 변경해야될 때 수정 후 war를 재배포해야되는 번거로움이 있다.
동적으로 주기를 선택할 순 없을까 싶어 찾아보니 Quartz를 이용하는 방법이 있다고 한다.
Quartz
Java 기반의 오픈 소스 스케줄링 라이브러리
- 다중 작업 지원: Quartz는 여러 작업을 스케줄링하고 동시에 실행할 수 있음(다중 Thread Architecture기반, 스레드풀)
- 리스너 및 이벤트: Quartz는 작업 수행 상태 및 이벤트에 대한 리스너를 등록할 수 있음
(작업의 수행 상태를 모니터링하거나 특정 이벤트에 대한 조치를 취할 수 있음)
주요 Interface
인터페이스명 | 설명 |
Scheduler | scheduler 와 상호작용하는 기본 API |
Job | 실제 작업을 수행하는 개체 |
JobDetail | Job 객체 정의에 사용 |
Trigger | 주어진 작업(Job)이 수행될 조건 결정 (특정시간, 횟수, 반복주기 등) |
JobBuilder | JobDetail 객체 빌드에 사용 |
TriggerBuilder | Trigger 객체 빌드에 사용 |
Quartz 사용방법
1. 의존성 추가
Maven:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
Gradle:
implementation 'org.springframework.boot:spring-boot-starter-quartz'
2. QuartzConfig
만약 Config가 아닌 따로 스케쥴러로 정의하고 싶다면, 리턴타입을 Scheduler가 아닌 void로 설정 후
마지막에 scheduler.start() 라는 코드를 붙여줘야된다. (Configuration 어노테이션도 제거)
@Configuration
@RequiredArgsConstructor
public class QuartzConfig {
private YourDBService yourDBService; // 데이터베이스 서비스 주입
@Bean
public Scheduler scheduler() throws Exception {
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
// JobDetail 생성
JobDetail jobDetail = JobBuilder.newJob(YourJob.class)
.withIdentity("작업명")
.build();
// 데이터베이스에서 Cron 표현식 가져오기
// String cronExpression = "0 0 9 * * ?";
String cronExpression = yourDBService.getCronExpressionFromDB(); // 데이터베이스에서 Cron 표현식을 가져옵니다.
// CronTrigger 생성 및 설정
CronTrigger cronTrigger = TriggerBuilder.newTrigger()
.withIdentity("트리거명")
.withSchedule(CronScheduleBuilder.cronSchedule(cronExpression))
.build();
// Job을 스케줄에 등록
scheduler.scheduleJob(jobDetail, cronTrigger);
return scheduler;
}
}
트리거설정 시 cron 표현식이 아닌 단순한 숫자만으로도 반복 주기를 설정할 수 있다.
(일정 시간말고 일정 간격 설정!)
Trigger 부분을 아래 코드로 교체해주면 끝!
SimpleTrigger cronTrigger = TriggerBuilder.newTrigger()
.withIdentity("트리거명")
.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInMinutes(5).repeatForever())
.build();
위 코드는 5분 간격으로 실행시키는 트리거 설정법이고, 분이 아니라 시간,초 단위로도 설정할 수 있다!
withIntervalInMilliseconds | 밀리초 |
withIntervalInSeconds | 초 |
withIntervalInMinutes | 분 |
withIntervalInHours | 시 |
여러 Trigger를 설정해야할 경우 Map 형태로 주입하면된다!
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초마다 실행 .forJob(jobDetail) .build(); Set<Trigger> triggerSet = new HashSet<Trigger>(); triggerSet.add(simpleTrigger); triggerSet.add(cronTrigger); scheduler.scheduleJob(jobDetail, triggerSet, false);
3. Job클래스
위의 config 코드를 보면 JobDetail 선언 시 YourJob.class를 주입받는다.
설정한 반복 주기대로 실행할 코드를 작성해주면 된다.
public class TestJob implements Job {
/**
* Job interface 구현체
* Job의 trigger 실행 시 execute() Method는 scheduler의 스레드 중 하나에 의해 호출
*
* @param JobExecutionContext
* 런타임 환경에 대한 정보, 이 환경을 실행한 Scheduler에 대한 핸들, 실행을 트리거한 트리거에 대한 핸들, 작업의 JobDetail 개체 및 기타 몇 가지 항목을 작업 인스턴스에 제공
*/
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
// 실행시킬 코드들
}
}
참고사이트
[Java] Java Quartz Scheduler 사용해보기(일정 주기로 실행하는 자바 스케쥴러)
728x90
'💡 백엔드 > Java' 카테고리의 다른 글
[JAVA] 서버에서 웹소켓 세션 종료하기 (0) | 2023.11.20 |
---|---|
[Java] HttpURLConnection 통해서 사이트 접속 후 응답받기 (1) | 2023.10.04 |
[Java] @Transactional 에 대해서 (& 프록시객체) (0) | 2023.08.04 |
순차 & 병렬 & 병행 처리의 차이점과 Java의 stream & parallelStream (0) | 2023.08.01 |
[Java] Hashtable, HashMap, ConcurrentHashMap 에 대해서 (0) | 2023.07.31 |