Programing/JAVA

Spring boot dynamic scheduling quartz, 동적 스케쥴링 동적 cron

리커니 2018. 12. 27.
반응형

Spring boot dynamic scheduling quartz, 동적 스케쥴링 동적 cron

 

 

Spring boot 에 Quartz 를 활용해 동적으로 스케쥴링이 되도록 구현하는 방법을 알아보겠습니다.

 

[Spec]

 

Spring boot 2.1.0

quartz 2.2.1

 

우선 Quartz를 의존성 주입합니다.

 

[Gradle]

 

implementation group: 'org.quartz-scheduler', name: 'quartz',  version: '2.2.1'

 

[Maven]

 

<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.2.1</version>
</dependency>

 

[SchedulerManagement.java]

 

@Component
public class SchedulerMangement {
    private SchedulerFactory schedulerFactory;
    
    @PostConstruct
    public void start() throws SchedulerException{
    
        schedulerFactory = new StdSchedulerFactory();
        CommonValiable.scheduler = schedulerFactory.getScheduler();
        CommonValiable.scheduler.start();

        JobDetail job1 = JobBuilder.newJob(Job1.class).build();
        JobDetail job2 = JobBuilder.newJob(Job2.class).build();
        
        CommonValiable.scheduler.scheduleJob(job1, CommonValiable.ffMinTrigger);
        CommonValiable.scheduler.scheduleJob(job2, CommonValiable.oneMinTrigger);
    }
}

 

scheduler와 trigger 경우 타 클래스에서 핸들링하게 편하도록 글로벌 static 변수로 사용하였습니다.

 

[CommonValiable.java]

 

public static Scheduler scheduler;
    
public static Trigger oneSecTrigger = TriggerBuilder.newTrigger().
      withIdentity(new TriggerKey("job1Key")).
      withSchedule(CronScheduleBuilder.cronSchedule("0/1 * * * * ?")).build();
    
public static Trigger twoSecTrigger = TriggerBuilder.newTrigger().
        withIdentity(new TriggerKey("job2Key")).
        withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * * * ?")).build();

 

위의 코드를 보시면 실제 로직이 있는 Job1, Job2 클래스를

JobDetail 로 선언한 후(Line 12-13) 스케쥴러에 trigger와 함께 등록(Line 15-16)하는 것을 보실 수 있습니다.

 

trigger는 withIdentity에 TriggerKey를 주어 해당 키로 trigger에 접근 할 수 있도록 하고

크론탭을 사용해 반복주기를 설정하였습니다.

 

크론탭 사용방법에 대해서는 아래의 Link를 참고하세요.

 

Link : https://aljjabaegi.tistory.com/400

 

Spring task scheduler Cron Expression 크론 표현식

Spring task scheduler Cron Expression 크론 표현식 이번 포스팅에서는 매번 해깔리는 크론 표현식에 대해 자세히 알아보도록 하겠습니다. 크론 표현식이 사용되는 Spring task scheduler 에 대해서는 아래의 Lin..

aljjabaegi.tistory.com

 

 

 

 

이렇게 구현하면 Job1은 1초마다, Job2는 2초마다 반복되게 됩니다.

 

그럼 Job1, Job2 클래스를 보도록 하죠.

 

[Job1.java]

 

public class Job1 implements Job{
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println("[job1]=================================");
    }
}

 

[Job2.java]

 

public class Job2 implements Job{
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println("[job2]=========");
    }
}

 

 

보시면 아시겠지만, 스케쥴링을 하려는 클래스는 Job interface를 implements 해야 합니다.

그리고 execute메소드 Override하여 로직을 구현하면, 해당 메소드가 반복 실행 되게 됩니다.

이제 프로젝트를 실행해 두 작업이 반복되는지 확인해보도록 하죠.

 

@SpringBootApplication
public class TestApplication {

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

 

 

[Console]

[job1]=================================
[job2]=========
[job2]=========
[job1]=================================
[job2]=========
[job2]=========
[job1]=================================

 

 

스케쥴이 잘 등록이 되었네요.

그럼 마지막으로 동적으로 Trigger를 변경하는 방법을 알아보겠습니다.

위에 트리거를 선언한 부분을 보시면 withIdentity로 trigger 키를 설정하였습니다.

해당 키로 트리거에 접근하여 새로운 트리거로 업데이트 해주면 됩니다. 

 

scheduler.rescheduleJob(old 트리거의 키값, new 트리거)

 

CommonValiable.scheduler.rescheduleJob(new TriggerKey("job1Key"), CommonValiable.twoSecTrigger);

 

이렇게 변경을 하면 Job1, Job2 모두 2초마다 실행되는 것을 확인 하실 수 있습니다.

반응형

댓글

💲 추천 글