quartz에 해당하는 글 2

[Quartz] Trigger

JAVA|2019. 7. 10. 18:16

중간에 내용이 다 날아가버렸어요...ㅠㅠ


Quartz에서 사용하고 있는 Trigger에 대해 다룬 내용이었는데..

컴퓨터가 리붓하면서.. 다 날아갔...



어쩔 수 없이 짧게나마 글을 다시 작성합니다!



Quartz에 Trigger의 종류는

사실 많아보이지만 구현체는 총 4가지

  • SimpleTriggerImpl
  • DailyTimeIntervalTriggerImpl
  • CalendarIntervalTriggerImpl
  • CronTriggerImpl

각 항목들을 가지고, 어떠한 요소들을 가지고 Job을 Triggering 하는지 살펴보려고 합니다.

 

물론, Trigger는 직접 생성하지 않고 TriggerBuilder와 ScheduleBuilder를 통해 객체를 생성하고

옵션 값들을 세팅하지만, 결국에는 Trigger 클래스가 생성되기에 Builder는 건너뛰고 Trigger를 살펴봅니다.

 

Common

공통적으로

스케줄이 유효한 기간에 해당하는 startTime과 endTime은 존재합니다.

 

SimpleTriggerImpl

SimpleTriggerImpl은 이름답게 가장 간단한 Trigger로 repeatCnt와 repeatInterval을 통해

단순하고 주기적인 스케줄링을 지원합니다.

repeatCnt는 -1이면 무한, 0 < 이면 그 횟수만큼 호출합니다.

repeatInterval은 단위가 milliseconds 입니다.

 

DailyTimeIntervalTriggerImpl

DailyTimeIntervalTriggerImpl은 SimpleTriggerImpl 보다 조금 더 확장된 Trigger이며

네이밍답게 하루하루에 집중되어있습니다.

마찬가지로 repeatCnt, repeatInterval이 존재하지만, repeatIntervalUnit 값이 존재하여  millisecond 뿐 아니라 다양한 시간대를 지원합니다.

또한 하루하루 스케줄링에 집중된 만큼 하루에 어떤 시간대에 유효한지(오전 9~오후 6)도 지정할 수 있으며(startTimeOfDay, startTimeOfDay)

특정 요일에만 실행할 수 있는 기능이 있습니다(daysOfWeek).

 

CalendarIntervalTriggerImpl

CalendarIntervalTriggerImpl은 마찬가지로  repeatInterval, repeatIntervalUnit이 존재하며

다른 트리거와 다르게 repeatCnt가 없고, TimeZone을 지정할 수 있으며

preserveHourOfDayAcrossDaylightSavings, skipDayIfHourDoesNotExist 두 개의 boolean 값이 존재한다.

 

CalendarIntervalTriggerImpl은 조금 익숙하지 않은 트리거라 조금 더 살펴본 후 내용을 추가로 보강할 예정입니다.

 

 

CronTriggerImpl

CronTriggerImpl은 흔히 사용하는 트리거로 CronExpression을 사용하여

스케줄 조건을 지정할 수 있는 Trigger입니다.

표현식을 직접 지정하거나, Quartz 라이브러리에 포함되어있는 CronExpression의 클래스에 객체를 생성하여 설정할 수도 있습니다.

CronExpression 안에 TimeZone도 물론 있습니다.

 

 

[TODO] Trigger 코드를 살펴보던 중 misFire에 대한 MisfireInstruction에 대한 내용 및 코드가 상당히 많았습니다.

기존 스케줄러를 만들 때 Misfire에 대해서는 고려 안 한 부분들이 있었는데

해당 부분은 조금 더 고민 및 학습 후 여기에 내용 추가 혹은 신규 글을 작성하도록 하겠습니다.

 

감사합니다.

댓글()

[Quartz] CronExpression getNextInvalidTimeAfter

JAVA|2019. 7. 2. 14:30

개발한 스케줄러에서는 cronExpression 해석부분 처리를 위해 Quartz의 CronExpression 클래스를 활용하고 있습니다.

(expression 파싱과 다음 시간 구하는 부분은 굳이.. 새로 개발할 필요성을 느끼지 못해서..)

 

스케줄 시작시간 시간부터 해당 스케줄의 다음 invoke 타임을 구하기 때문에

ex) 등록 9시, 시작시간 10시, cronExpression 5초마다 기존에는 10시 5초 부터 스케줄 실행.. 사용자는 10시부터 실행되길 기대

 

 

스케줄 시작시간(startTime) 시점과 invoke 타임이 일치하는 경우 invoke가 안되는 부분이 있었습니다.

때문에, "아 그럼 미리 invokeTime 을 구해두면 되겠구나" 라는 생각으로 미리 구하자는 생각으로 작업에 들어갔고,

 

1. 현재 시간이 스케줄 시작시간 보다 이른경우 스케줄 시작시간 시점으로 다음 스케줄 시간을 구해 놓자

 

라고 생각하고 테스트 작성 후 개발했지만 생각과 다르게 동작했습니다..

(10시를 넘겼는데, 계속 nextInvokeTime은 10시 5초..)

해서.. 코드를 열어보니..

준 시간에 1000, 즉 1초를 더하고 있었습니다..;;

(하긴.. getTimeAfter이니.. quartz cron 표현식 상 초단위이기 때문인것..)

 

결국 교훈은 가져다 쓴 코드는 코드를 까보고 이해하고 쓰자.. 입니다.

 

 

 

댓글()