반응형

Spring Cron 에서 초단위로 반복 스케줄러 설정 시 


60초 / 설정초 에서 나머지가 없는 설정 초에선 정확한 초에 반복을 하며 


나머지가 생기면 60초 나눈 값의 몫으로 반복후 마지막엔 나머지 값으로 실행하고 이 사이클로 반복 하게 됩니다.


Ex) 26초로 반복 스케줄러 설정시


00시 00분 26초 (나눈 )

00시 00분 52초 (나눈몫)

00시 01분 00초 (나머지값)


이렇게 실행 되는 로그를 확인하였습니다.


34 초 반복 스케줄러 설정시


00시 00분 34초

00시 01분 00초

00시 01분 34초


58 초 반복 스케줄러 설정시


00시 00분 58초

00시 01분 00초

00시 01분 58초


스케줄러가 실행중일때 반복 하지 않을수 있습니다.


Ex) 58초로 반복 실행주이며 DB 데이터 조회시 4초가 걸린다라고 하면 


00시 00분 58초

00시 01분 00초 엔 실행 되지 않고

00시 01분 58초 실행이 됩니다.



짧은 텀의 스케줄러는 정확하지 않을수 있는거 같습니다.


문제가 되거나 이상한 내용이 있으면 답글 달아주시면 감사하겠습니다.







반응형

Spring cron 스케줄러를 이용하여 작업을 하였습니다.


Cron Expression 으로  0 0 0 * * * (자정마다) 설정 하였으며 


로그 확인 결과 23:59:59 (xxx) [xxx는 밀리초] 이렇게 실행이 되는 문제가 생겼습니다.


개발 PC 와 가상머신의 테스트 환경 그리고 고객사 테스트 PC 3번의 테스트를 


했으며 고객사 테스트 PC 에선 자정 시간으로 테스트는 못해보고 1분마다 스케줄러 


설정하여 00시 01분 00초 에 실행하여 확인후 문제 없는걸 확인 하였는데


고객사 운영 PC 에 적용 하고 1분마다 스케줄러 설정하여 로그 확인 하였을때


xx시 01분 00초 에 실행되는걸 확인 후 24시 00시 00분 으로 스케줄러 설정 하고


확인한 결과 위와 같이 23시 59분 59초 xxx밀리초 로 먼저 실행이 되어있었습니다.


문제 확인결과 밀리초 먼저 실행 된걸 확인 후 열심히 구글링 하며 


크론은 밀리초 단위로 설정은 불가능하며 24시 (자정)이 되기 바로 전에 일정을 다시 


작성한다라는걸 알게 되었습니다. 그래서 자정으로 설정시에 밀리초 먼저 실행 


할수도 있다라는 걸 알게 되어 소스를 수정하였습니다.


수정 내용은 자정으로 스케줄러 실행시 스케줄러 메소드에서 00초로 Default 값으로  


변수 선언하고 new Date() 로 현재 시간을 SimpleDateFormat 으로 초만 가져와 날짜 


비교 메소드(CompareTo) 사용하여 Default 값 보다 현재 시간 계산한 초가 크면 


다시 new Date() 로 현재 시간을 SimpleDateFormat 으로 밀리초 가져온 후 


1000 - 현재 밀리초 = 계산 된 밀리초를 Thread.sleep(계산된 밀리초) 만큼 쉬게 한후 


원하는 서비스를 실행 하도록 수정하였습니다.


그리고 Cron 에서 zone="Asia/Seoul" 이렇게 Date zone 설정도 가능하여 


"Asia/Seoul" zone 설정도 하였습니다.




아래 글은 구글링한 Cron 자정 설정시 문제 되는 내용입니다.



Cron은 시작할 때 모든 crontab 정보를 읽습니다. 다음 24 시간 내에 실행될 모든 작업 목록을 시간 순서대로 정렬합니다. 그런 다음 다음 작업이 시작될 때까지의 시간을 표시하고 해당 기간 동안 타이머에 잠자기 시간을 게시합니다. 

24 시간이되기 바로 전에 일정을 다시 작성합니다 (기본적으로 목록의 끝 부분에 "다시 작성된 목록"이라는 내부 작업을 게시합니다). 그리고 crontab -edit을 실행할 때마다 cron에 SIGINT를 게시하여 일정이 무효화되었으므로 일정을 다시 작성하도록 지시합니다. 

그것은 엄청나게 정밀한 기술이 아닙니다. 때로는 cron이 수 밀리 초의 수면에서 일찍 빠져 나올 수 있습니다. 귀하의 호스트가 벽 시간을 조정했기 때문에 발생했을 수 있습니다. 아마도 Network Time Server에 의해 조정되었을 것입니다. 02 : 59 : 59.995로 실행되면 02:59:59로보고됩니다. 

이 문제가 정말로 중요한 경우, 수면 1 또는 적절한 시간 지연을 직업에 적용하십시오. 

03 : 00 : 00에 직장을 운영한다고 절대 추측 할 수 없습니다. 시스템이 바쁠 때 또는 사용자가 일부 cron / at / batch 할당량을 초과하는 경우 (주로 최대 4 개의 백그라운드 작업으로 기본 설정되는 경우) Cron은 작업을 지연시킬 수 있습니다. 정확한 시간이 필요하면 cron이 일찍 일을 시작하게하고, 코드가 정확한 시간을 찾고 "진짜" "시작 시간까지 자신의 나노 슬립을 설정하도록하십시오. 그러나 스케줄러는 타이머 만료시 CPU를 확보하지 못하도록 결정할 수 있습니다. 

나는 분당 초 후에 30 초를 시작하기 위해 일자리를 마이크로 시간으로 사용했습니다. 이렇게하면 분당 일정 잡기 작업에 비해 CPU 사용 시간이 단축됩니다. 



출처 : https://it.toolbox.com/question/cronjob-running-a-second-early-than-scheduled-032212

'java > cron' 카테고리의 다른 글

Spring Cron 초 단위로 스케줄러 작업 걸때!!  (0) 2018.03.06

+ Recent posts