코딩마을방범대

Java Quartz를 이용해 동적 스케줄링 설정하기 본문

💡 백엔드/Java

Java Quartz를 이용해 동적 스케줄링 설정하기

신짱구 5세 2023. 10. 4. 14:22

 

 

 

스케쥴러(Scheduler)에 대하여

스케쥴러란? 일정 시간마다 코드를 실행시킬 수 있음 스레드(sleep)을 이용하면 제대로 관리하지 못할 경우 exception이 날 수 있음 사용법 1. 메인 클래스에 어노테이션 선언 @SpringBootApplication @EnableA

sweet-rain-kim.tistory.com

 

위의 방법대로 @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 사용해보기(일정 주기로 실행하는 자바 스케쥴러)

Quartz Trigger를 이용한 간단한 스케줄링

 

 

SMALL