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

jaycee·2023년 11월 29일
0

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개의 댓글

관련 채용 정보