[Quartz Scheduler, Spring Boot] Job이 두 번 실행되는 이슈

mrcocoball·2025년 1월 22일

Spring Framework

목록 보기
13/20

개요

Quartz Scheduler와 Spring Batch를 연동해서 배치를 돌리던 도중, 동일한 Job이 2번 실행되는 것을 확인하였다.
별다른 설정을 하지 않았는데 모든 Job이 2번 실행되고 있어서 당황스러웠다.

확인 결과 및 대응

@DisallowConcurrentExecution

검색을 해보니 Quartz Scheduler에서 동일한 Job이 2번 실행되는 이슈는 생각보다 빈번한 모양이었다.
일단 가장 많이 알려진, 간단한 대응 방법인 @DisallowConcurrentExecution 어노테이션을 Job 구현체에 적용하였다.

@DisallowConcurrentExecution
public class CommonBatchJob implements Job {

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
		...
    }

}

그러나 이 방법을 사용했음에도 여전히 Job은 2번씩 돌아가고 있었다.

왜 Scheduler가 2개지?

다시 한 번 실행 로그를 확인해본 결과, 처음 Scheduler가 실행될 때 Scheduler 인스턴스가 2번 초기화되고 실행되고 있었다.

2025-01-17T01:35:35.725Z INFO 7 --- [ main] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED'
...
2025-01-17T01:35:35.725Z INFO 7 --- [ main] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance.
...
2025-01-17T01:35:35.403Z INFO 7 --- [ main] org.quartz.core.QuartzScheduler : Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.
...
2025-01-17T01:35:35.382Z INFO 7 --- [ main] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'DefaultQuartzScheduler' with instanceId 'NON_CLUSTERED'

Configuration에서 Scheduler를 Bean으로 등록해놨는데 이 Scheduler 뿐만 아니라 DefaultQuartzScheduler 역시 같이 동작이 되고 있었고, 이 스케줄러에도 Job이 등록이 되어 실행되고 있었던 것이다.

관련 옵션을 비활성화하려면 application.yml에서 다음 부분을 수정해야 했다.

spring:
  quartz:
    auto-startup: false

수정을 하고 나니 DefaultQuartScheduler가 초기화는 되지만, 실행은 되지 않아서 내가 지정한 Scheduler에서만 Job이 정상적으로 1번만 실행되기 시작했다.

profile
Backend Developer

0개의 댓글