spring batch 중복 실행 세팅 방법
중복 실행을 허용한다면
jobBuild
시 .incrementer(RunIdIncrementer())
를 설정한다.
stepBuild
시 .allowStartIfComplete(true)
를 설정한다.
spring batch는 기본적으로 중복 실행을 허용하지 않는다.
그렇다면 중복 실행 여부를 판단하는 기준 무엇일까?
이 기준은 입력받은 job parameter 가 동일한지 확인하는 것이다. 기본적으로 아무런 세팅을 하지 않는 경우라면 동일한 job parameter가 입력됐는지 batch job 메타데이터 테이블 batch_job_execution_params
에 동일한 파라미터가 있는지 검사하여 판단한다.
그래서 무한정 중복 실행이 가능하도록 의도한다면 job paramter에 의도적으로 현재 timestamp를 찍어서 실행하기도 한다. 무언가 검사하는 배치라거나, 테스트 시에는 무한정 실행되어도 상관없으므로 이런 방법을 쓸 수도 있다.
중복 실행을 허용할 경우 심각한 오류를 초래할 수 있다. 예를 들어 중복해서 환불을 해준다든지, 중복해서 물건을 출고 시킨다든지...
그래서 개발자는 이에 맞게 job parameter를 설계한다. (예를 들어 한시간에 한번 실행할 것이면, 잡 파라미터로 20231127T01, 20231127T02, 20231127T03 식으로 파라미터로 관리할 수 있다.)
또한, 특정 파라미터로 배치가 돌다가 실패되어 중단된 경우, 중단된 지점부터 다시 실행할 수 있다. 예를들어 11/26일 새벽 1시에 배치를 다시 돌리고 싶은 경우 파라미터로 20231127T01을 입력해주면 중단 지점부터 다시 시작할 수 있다.
아래와 같이 잡 설정에서 .incrementer(RunIdIncrementer())
부분을 추가하면 된다. 4.0 이하 버젼에서는 버그가 있다고 하니 참고.
그리고 알아야 할 것은, 일단 job parameter가 세팅되어야 incrmenter가 동작한다. job parameter가 없는 경우 중복 실행을 허용하고 싶으면 아래의 allowStartIfComplete를 설정해준다.
@Bean
fun someJob(): Job {
return jobBuilderFactory["someJob"]
.incrementer(RunIdIncrementer())
.listener(someBatchListener())
.start(someStep(null))
.build()
}
step 설정 시 allowStartIfComplete(true)
를 설정해주면 incrementer가 있건 없건, 중복 실행이건 아니건 실행이 된다.
@Bean
@JobScope
fun someStep(@Value("#{jobParameters['requestDate']}")requestDate: String?): Step {
return stepBuilderFactory["someStep"]
.chunk<InModel, OutModel>(CHUNK_SIZE)
.reader(someReader())
.processor(someProcessor)
.writer(someWriter)
.allowStartIfComplete(true)
.transactionManager(transactionManager)
.build()
}