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
이렇게 구현하면 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초마다 실행되는 것을 확인 하실 수 있습니다.
'Programing > JAVA' 카테고리의 다른 글
ASN.1 구조체 생성 및 인코딩 방법 (0) | 2019.03.18 |
---|---|
ASN.1 Java jar 파일 만드는 방법 How to make ASN.1 jar file (0) | 2019.03.15 |
JAVA Collection Framework 정리, 자바 컬렉션, List, Set, Map, Queue, Stream 4부 Map (0) | 2018.11.14 |
JAVA Collection Framework 정리, 자바 컬렉션, List, Set, Map, Queue, Stream 3부 Queue (0) | 2018.11.14 |
JAVA Collection Framework 정리, 자바 컬렉션, List, Set, Map, Queue, Stream 2부 Set (0) | 2018.11.13 |
댓글