버전 비교

  • 이 줄이 추가되었습니다.
  • 이 줄이 삭제되었습니다.
  • 서식이 변경되었습니다.

...

코드 블럭
languagexml
titlepom.xml
linenumberstrue
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

Qurtz의 Quartz환경설정 파일을 작성합니다. 다음의 예제에서는 RAM Job Store를 사용하였으나 Quartz Job이 영속적으로 동작하기 위해서는 JDBC Job Store를 사용할 수 있으며 이 경우 다음을 수정해야 합니다.

코드 블럭
languagetext
titlesrc/main/resources/quartz.properties
linenumberstrue
# thread-pool
org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount=80
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread=true

# job-store
org.quartz.jobStore.class=org.quartz.simpl.RAMJobStore

# others
org.quartz.jobStore.misfireThreshold = 60000

Quartz Starter를 추가했으므로 Spring Boot는 자동으로 Quartz를 실행시킬 것이나, 커스터마이징을 위해서 다음과 같이 Quartz Auto Configuration을 exclude시킵니다.

코드 블럭
languageyml
titlesrc/main/resources/application.yml
linenumberstrue
spring:

  #################
  ## Auto Configure
  #################

  autoconfigure:
    exclude:
      - org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration

...

코드 블럭
languagejava
linenumberstrue
import io.datadynamics.projects.migrator.jobs.MigrationJob;
import lombok.extern.slf4j.Slf4j;
import org.quartz.JobDetail;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.scheduling.quartz.JobDetailFactoryBean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import org.springframework.scheduling.quartz.SimpleTriggerFactoryBean;
import org.springframework.scheduling.quartz.SpringBeanJobFactory;

@Configuration
@Slf4j
public class QuartzConfiguration {

    @Autowired
    ApplicationContext applicationContext;

    @Bean
    public SchedulerFactoryBean scheduler(Trigger trigger, JobDetail job) {
        SchedulerFactoryBean schedulerFactory = new SchedulerFactoryBean();
        schedulerFactory.setConfigLocation(new ClassPathResource("quartz.properties"));

        schedulerFactory.setJobFactory(springBeanJobFactory());
        schedulerFactory.setJobDetails(job);
        schedulerFactory.setTriggers(trigger);
        return schedulerFactory;
    }

    @Bean
    public SpringBeanJobFactory springBeanJobFactory() {
        AutoWiringSpringBeanJobFactory jobFactory = new AutoWiringSpringBeanJobFactory();
        jobFactory.setApplicationContext(applicationContext);
        return jobFactory;
    }

    @Bean
    public JobDetailFactoryBean jobDetail() {
        JobDetailFactoryBean jobDetailFactory = new JobDetailFactoryBean();
        jobDetailFactory.setJobClass(MigrationJob.class);
        jobDetailFactory.setName("Migration Job");
        jobDetailFactory.setDescription("Invoke Migration Job service...");
        jobDetailFactory.setDurability(true);
        return jobDetailFactory;
    }

    @Bean
    public SimpleTriggerFactoryBean trigger(JobDetail job) {
        SimpleTriggerFactoryBean trigger = new SimpleTriggerFactoryBean();
        trigger.setJobDetail(job);

        int frequencyInSec = 1;
        log.info("Configuring trigger to fire every {} seconds", frequencyInSec);

        trigger.setRepeatInterval(frequencyInSec * 6000);
        trigger.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY);
        trigger.setName("Mail Sending Trigger");
        return trigger;
    }
}

Spring Scheduling에 대해서 상세하게 알고 싶은 경우 https://www.baeldung.com/spring-quartz-schedule 을 참고하십시오.