Spring boot Quartz - cron trigger (feat. 사이드 프로젝트)
최근에 주기적으로 특정 시간에 특정 알람을 보내야하는 사이드 프로젝트를 진행하면서, Quartz 를 사용해 보았다. 그래서 개발하고 그에 따른 후기를 남겨본다.
먼저 알람 발송 시점은 아래와 같다.
그날 그날 휴일인지 평일인지에 따라서 또한 평일인 경우 주간인지 야간인지에 따라 담당자가 다르다.
따라서 해당 담당자에게 "너 이제 일해야됨!!" 이렇게 알람을 보내는 서비스를 개발했다.
알람 방법에 대해선 생략하고, 어떻게 Scheduler 를 활용 했는지에 초점을 두고 글을 쓰려고 한다.
먼저, 주간, 야간, 휴일 근무시간이 어떻게 되는지 정리해보겠다.
- 주간 : working day (not holiday, not weekend) 09:00 ~ 18:00
- 야간 : working day (not holiday, not weekend) 18:00 ~ 23:00
- 휴일 : holiday ( including weekend ) 09:00 ~ 23:00
우선 공통점을 뽑아낸다면, 하루 전은 모두 공통되어 있다.
내일 담당자에게 전날에 22:00 에 "내일 너 일해야됨!" 을 보내야 한다.
따라서 주기적으로 22:00 에 발송을 보내야 한다.
그리고 나머지 시점은 각각 고유하게 시각을 가지고 있다.
시점과 해당 시점에서 해야하는 일을 정리해보면, 아래와 같다.
1. 22:00 - 오늘이 working day 인지 holiday 체크 후
working day -> 내일 주간 담당자와 야간담당자에게 알람을 보낸다.
holiday -> 내일 휴일 담당자에게 알람을 보낸다.
2. 09:00 - 오늘이 working day 인지 holiday 체크 후
working day -> 오늘 주간 담당자에게 알람을 보낸다.
holiday -> 아무것도 안한다.
3. 08:55 - 오늘이 working day 인지 holiday 체크 후
working day -> 아무것도 안한다.
holiday ->오늘 휴일 담당자에게 알람을 보낸다.
4. 17:55 - 오늘이 working day 인지 holiday 체크 후
working day -> 오늘 야간 담당자에게 알람을 보낸다.
holiday -> 아무것도 안한다.
5. 23:00 - 오늘이 working day 인지 holiday 체크 후
working day -> 오늘 야간 담당자에게 근무시간 종료 알람을 보낸다.
holiday -> 오늘 휴일 담당자에게 근무시간 종료 알람을 보낸다.
JobDetail 정의와 CronTrigger 설정을 보면 아래와 같다.
부족한 네이밍 센스와 영어 실력 이기 때문에 변수명은 이해 해주길 바라며,
Thread 및 job-store 설정은 따로 하지 않았다.
따라서 default 로 Thread 수는 10개, job-store 는 따로 이력을 관리하지 않아도 되기에, 그대로 인메모리를 사용하도록 놔두었다.
기본적으로 Job 은 org.quartz.Job 인터페이스를 구현하고 execute 메서드를 재정의하면 된다.
따라서 아래와 같이 scheduler.start() 를 호출하게 되면 cron trigger 의 시점에 따라서 Job 인터페이스를 구현하고 execute 를 재정의한 메서드가 작동되게 된다.
다음에 기회가 된다면, spring-batch 와 함께 사용하여, Thread 튜닝 및 persistence job-store 도 구현해 봐야겠다.
먼저 알람 발송 시점은 아래와 같다.
그날 그날 휴일인지 평일인지에 따라서 또한 평일인 경우 주간인지 야간인지에 따라 담당자가 다르다.
따라서 해당 담당자에게 "너 이제 일해야됨!!" 이렇게 알람을 보내는 서비스를 개발했다.
알람 방법에 대해선 생략하고, 어떻게 Scheduler 를 활용 했는지에 초점을 두고 글을 쓰려고 한다.
먼저, 주간, 야간, 휴일 근무시간이 어떻게 되는지 정리해보겠다.
- 주간 : working day (not holiday, not weekend) 09:00 ~ 18:00
- 야간 : working day (not holiday, not weekend) 18:00 ~ 23:00
- 휴일 : holiday ( including weekend ) 09:00 ~ 23:00
우선 공통점을 뽑아낸다면, 하루 전은 모두 공통되어 있다.
내일 담당자에게 전날에 22:00 에 "내일 너 일해야됨!" 을 보내야 한다.
따라서 주기적으로 22:00 에 발송을 보내야 한다.
그리고 나머지 시점은 각각 고유하게 시각을 가지고 있다.
시점과 해당 시점에서 해야하는 일을 정리해보면, 아래와 같다.
1. 22:00 - 오늘이 working day 인지 holiday 체크 후
working day -> 내일 주간 담당자와 야간담당자에게 알람을 보낸다.
holiday -> 내일 휴일 담당자에게 알람을 보낸다.
2. 09:00 - 오늘이 working day 인지 holiday 체크 후
working day -> 오늘 주간 담당자에게 알람을 보낸다.
holiday -> 아무것도 안한다.
3. 08:55 - 오늘이 working day 인지 holiday 체크 후
working day -> 아무것도 안한다.
holiday ->오늘 휴일 담당자에게 알람을 보낸다.
4. 17:55 - 오늘이 working day 인지 holiday 체크 후
working day -> 오늘 야간 담당자에게 알람을 보낸다.
holiday -> 아무것도 안한다.
5. 23:00 - 오늘이 working day 인지 holiday 체크 후
working day -> 오늘 야간 담당자에게 근무시간 종료 알람을 보낸다.
holiday -> 오늘 휴일 담당자에게 근무시간 종료 알람을 보낸다.
JobDetail 정의와 CronTrigger 설정을 보면 아래와 같다.
부족한 네이밍 센스와 영어 실력 이기 때문에 변수명은 이해 해주길 바라며,
Thread 및 job-store 설정은 따로 하지 않았다.
따라서 default 로 Thread 수는 10개, job-store 는 따로 이력을 관리하지 않아도 되기에, 그대로 인메모리를 사용하도록 놔두었다.
기본적으로 Job 은 org.quartz.Job 인터페이스를 구현하고 execute 메서드를 재정의하면 된다.
따라서 아래와 같이 scheduler.start() 를 호출하게 되면 cron trigger 의 시점에 따라서 Job 인터페이스를 구현하고 execute 를 재정의한 메서드가 작동되게 된다.
다음에 기회가 된다면, spring-batch 와 함께 사용하여, Thread 튜닝 및 persistence job-store 도 구현해 봐야겠다.
오오 좋은 글 감사합니다! 스케줄러를 사용할 일이 있다면 고려해봐야겠어요!
답글삭제혹시 용진님?
삭제