Preloader image
DDD

자바

Spring Boot에서 Quartz 스케줄러를 동적으로 사용하는 방법

작성자 관리자 (admin)
조회수 4,911
입력일 2024-05-17 10:08:25

Spring Boot에서 Quartz 스케줄러를 동적으로 사용하는 방법

Spring Boot와 Quartz를 사용하여 스케줄링 작업을 동적으로 설정하는 방법을 알아보겠습니다. 특히, cron 표현식을 외부 설정 파일에서 가져와 동적으로 적용하는 예제를 작성하겠습니다.

1. 프로젝트 설정
먼저, Maven 또는 Gradle을 사용하여 프로젝트를 설정합니다. 여기서는 Maven을 사용한 예제를 제공합니다.

- pom.xml
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-quartz</artifactId>
    </dependency>
</dependencies>

2. 외부 설정 파일 설정
외부 설정 파일에서 cron 표현식을 정의합니다.

- application.properties
cron.expression=0/10 * * * * ?
- application.yml
cron:
  expression
: "0/10 * * * * ?"

3. Quartz 설정
Quartz 설정 클래스를 작성하여 외부 설정 파일의 값을 동적으로 가져와 적용합니다.

- java (Configuration)
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.CronScheduleBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;

@Configuration
public class QuartzConfig {

    @Value("${cron.expression}")
    private String cronExpression;

    @Bean
    public JobDetail jobDetail() {
        return JobBuilder.newJob(MyJob.class)
                .withIdentity("myJob")
                .storeDurably()
                .build();
    }

    @Bean
    public Trigger trigger(JobDetail jobDetail) {
        return TriggerBuilder.newTrigger()
                .forJob(jobDetail)
                .withIdentity("myTrigger")
                .withSchedule(CronScheduleBuilder.cronSchedule(cronExpression))
                .build();
    }

    @Bean
    public SchedulerFactoryBean schedulerFactoryBean(Trigger trigger, JobDetail jobDetail) {
        SchedulerFactoryBean schedulerFactory = new SchedulerFactoryBean();
        schedulerFactory.setJobDetails(jobDetail);
        schedulerFactory.setTriggers(trigger);
        return schedulerFactory;
    }
}

4. Quartz Job 작성
Quartz에서 실행될 작업을 정의하는 클래스를 작성합니다.

- java (MyJob)
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import java.time.LocalDateTime;

public class MyJob implements Job {
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println("Quartz Job executed at: " + LocalDateTime.now());
    }
}

5. Spring Boot 애플리케이션 클래스
Spring Boot 애플리케이션 클래스를 작성하여 애플리케이션을 실행합니다.

- java (~Application)
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class QuartzApplication {
    public static void main(String[] args) {
        SpringApplication.run(QuartzApplication.class, args);
    }
}

6. 실행 및 테스트
애플리케이션을 실행하면 MyJob 클래스에 정의된 작업이 외부 설정 파일에서 정의한 cron 표현식(여기서는 매 10초마다) 대로 실행되는 것을 볼 수 있습니다. 콘솔에 "Quartz Job executed at: " 메시지가 주기적으로 출력됩니다.