FaultTolerance
스프링 배치를 사용시 어떠한 Exception 이 발생시 중단 후 실패처리를 하지 않고, 그대로 배치 잡을 계속해서 실행하고 싶을 때 사용한다.
stepBuilderFactory.get("step")
.<ReadItem, WriteItem>chunk(3)
.faultTolerant()
.skip(Exception.class)
.skipLimit(Integer.MAX_VALUE)
- Exception.class 및 그 하위 Exception이 발생했을때, 중단처리 하지 않고 계속 진행한다.
- skipLimit 횟수 만큼 Exception 발생을 용인 한다.
ProcessorNonTransactional
위와 같이 청크단위 처리방식의 배치를 사용하는 경우 청크단위로 트랜잭션이 처리가 되어진다.(insert or update 등..)
청크단위로 진행되며 Exception 발생시, 아래와 같은 문제가 발생한다.
{1, 2, 3}, {4, 5(문제발생), 6}, {4, 6}, {7, 8, 9} ....
4번에 해당하는 작업이 두번 실행되어, 트랜잭션과 무관하게 한번만 실행되어야 하는 작업인 경우(외부 api 를 호출 또는 push 메세지 발송 등) 두번 실행되는 경우가 발생한다.
이러한 경우 processorNonTransactional 을 추가한다.
stepBuilderFactory.get("step")
.<ReadItem, WriteItem>chunk(3)
.faultTolerant()
.skip(Exception.class)
.skipLimit(Integer.MAX_VALUE)
.processorNonTransactional()
processorNonTransactional 을 추가 할 경우 아래와 같이 실행된다.
{1, 2, 3}, {4, 5(문제발생)}, {6}, {7, 8, 9} ....
단, 위와 같은 실행은 Processsor에서만 한정이며, writer는 마찬가지로 청크단위로 재실행 된다.
'SPRING' 카테고리의 다른 글
SpringBoot JpaRepository 를 Dependency Scan 에서 찾지 못할때 (0) | 2022.11.10 |
---|---|
Spring Retry (0) | 2022.05.18 |
Spring Envers 로 자동 이력 관리 (0) | 2021.06.20 |
Spring Event (0) | 2021.05.27 |
Spring 메소드 실행 실패시 재실행 (0) | 2021.05.24 |