spring batch job 중복 실행 허용 세팅 방법

jaycee·2023년 11월 29일

goal

spring batch 중복 실행 세팅 방법

summary

중복 실행을 허용한다면
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()
}

incrementer 상관없이 무조건 실행을 허용시키고 싶으면?

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()
}
profile
오늘도 하나 배웠다.

0개의 댓글