Quartz의 misfired trigger 처리 정책

Programming/Java 2014.05.19 댓글 Joshua95

특정 데몬 hang을 분석하면서 Quartz를 의심하여 추적하다보니 (미안하다 쿼츠야, 내가 널 의심했구나아. ^^;) 평소 궁금했던 내용을 만나게 되어 저처럼 궁금한 사람이 있을 듯 하여 정리합니다.

 

Q. 스케쥴러가 제때 실행이 안되면 어떻게 되나요?

데몬이 멈추는 이슈가 Quartz의 스케쥴러가 밀리면서 해당 작업에 대한 일이 밀려서가 아닐까 의심하다.

 

A.그건 오해야~ ^^

스케쥴링을 하다보면 시간내 작업이 끝나지 않을 경우, 다음 스케쥴을 실행 할 수 없습니다.

이처럼 다음 스케쥴이 실행되지 않을 경우를 misfired trigger 라고 하는데,

이러한 misfired trigger만을 위한 별도 정책을 설정하여 처리할 수 있습니다.

 

misfired로 인식하는 시간은 설정이 가능하며 (misfiredThreadhold), 기본은 1 (60000 milliseconds) 입니다.

 

misfired trigger에 대한 처리 정책은 다음과 같습니다. (CronTrigger 기준, SimpleTrigger도 비슷하지만 정책 개수가 약간 다름)

 - MISFIRE_INSTRUCTION_SMART_POLICY (Default) - MISFIRE_INSTRUCTION_FIRE_ONCE_NOW 를 사용

 - MISFIRE_INSTRUCTION_IGNORE_MISFIRE_POLICY : 모든 misfired trigger를 실행

 - MISFIRE_INSTRUCTION_FIRE_ONCE_NOW  : misfired trigger가 한개이상 있는 경우, 한번만 실행

 - MISFIRE_INSTRUCTION_DO_NOTHING : msifired trigger를 모두 무시함

 

제가 보던 프로그램은 misfired trigger에 대하여 별도의 정책을 지정하지 않았으므로, 그냥 기본값을(misfiredThreadhold=60000, MISFIRE_INSTRUCTION_SMART_POLICY)을 사용하게 됩니다.

즉, misfired trigger1분 이내에 수행되지 못할 경우 misfired 로 취급하게 되며, MISFIRE_INSTRUCTION_FIRE_ONCE_NOW 정책이 기본 적용되어 아무리 오랜 작업이 걸리는 스케쥴이 있더라도 해당 작업이 끝난 후 밀린 misfired는 한번만 수행됩니다.

 

따라서 (추정하기는) 스케쥴링 작업이 밀렸다고 뭔가 전체 프로세스에 영향을 줄 가능성은 적을 것이다가 결론입니다.


 - Joshua95 (14-05-19)

'Programming > Java' 카테고리의 다른 글

JVM 메모리 설정  (0) 2014.04.21
Java VisualVM을 이용해서 Remote 장비 리소스 모니터링하기  (0) 2014.04.18

댓글