본문 바로가기
Spring/Spring

Spring @Scheduled 가 동작할때 rate나 delay보다 더 늦게 메소드가 종료되면 어떻게 동작할까?

by 졸린개발자 2024. 3. 2.

안녕하세요 졸린 개발자입니다.

오늘은 문득 궁금해진, Spring의 @Scheduled 가 동작할때 rate나 delay보다 더 늦게 메소드가 종료되면 어떻게 동작할까에 대해 알아보겠습니다.

 

fixedDelay에서는 어떨까요?

아래 코드를 봅시다. 어떻게 동작할것 같나요?

 

 

정답을 보시죠

3초마다 동작하고 있습니다.

fixedDelay의 동작은 마지막 스케쥴링 동작 이후 delay에 지정된 만큼 기다렸다가 시작합니다.

 

즉 2초동안 sleep + 1초동안 delay을 거쳐 3초마다 한번씩 실행이 되는 것이죠.

 

 

그럼 fixedRate를 살펴볼까요?

2초마다 실행이 되네요.

왜 2초마다 실행이 될까요? 분명 rate를 1초를 주었지 않았나요?

 

그 해답은 재미있게도 실제 스케쥴링을 담당하는 java의 ScheduledExecutorService에서 찾을 수 있었습니다.

If any execution of this task takes longer than its period, then subsequent executions may start late, but will not concurrently execute.

 

만약 지정된 rate보다 더 늦게 끝나면 바로 다음 스케쥴링이 되지만, 동시에 실행되지는 않습니다.

 

그럼 cron을 지정하면 어떨까요?

5초동안 동작하지만, cron은 1초마다 스케쥴 되게 설정하였습니다.

 

동시에 동작하지 않고, 5초가 지나서 스케쥴링 될때마다, 바로 다음 스케쥴링이 되어 실행되는군요.

 

1초에서 7초는 6초 차이라서, 5초가 아니지 않나요? 라고 생각하실 수 있지만,

cron은 1.0초, 즉 fixedRate나 fixedDelay와 다르게 현재 시각이 1.0초여야 다음 스케쥴링이 됩니다.

 

그래서 1초 -> 6초 뒤에 스케쥴링을 하려고 보니, 다음 1초 간격은 7.0초 였던 것이죠.

 

 

결론

스케쥴링 관련 궁금증이 더 생기면 더 재밌는 포스팅으로 찾아뵙겠습니다.