DevBoi

[Spring Batch] How to FailOver(Retry) 본문

Develop/[Spring Batch]

[Spring Batch] How to FailOver(Retry)

HiSmith 2022. 4. 10. 15:34
반응형

Spring Batch에서는 배치에 대한 실패가 발생했을 경우, Retry 관련 기능을 제공해준다.

Retry 는 ItemReader에서는 동작하지 않는다. Writer, Processor에서만 동작한다.

 

 

따라서 ItemReader에서는 Skip만 지원한다는 것을 알아두자

Step은 기본적으로 Repeatable 템플릿을 사용한다. 하지만 실행될때 Retry Template에 실행을 위임한다.

 

<Retry 발생 과정>

- ItemProcessor

ItemProcessor에서 예외가 발생한다.

Retry Template은 Repeat Template으로 돌아간다.

Reader로 부터 다시 값을 요청하는 것이 아니라,  캐싱해서 가지고 있는 Input chunck를 가지고 와서

1부터 다시 프로세스를 동작한다. skip 과 다르게 실패 건에 대한 재처리를 하고, 계속 실패나면 계속 시도하다가 끝낸다.

 

- ItemWriter

write 작업중에 예외 발생시에, RepeatTemplate으로 돌아간다.

OutPut Chunk를 받아와서 다시 처음부터 쓰기 시작한다.

 

 

1. Chunk Step 은 기본적으로 RepeatTemplate을 통해 Chunk 수 만큼 반복하면서 수행한다.

2. Retry 가 설정되면 ItemProcessor와 ItemWriter의 실행 권한을 RetryTemplate으로 위임한다.

3. 해당 Retry Template이 Retry 가능한지 체크한다. 가능하다면, Retry CallBack 아니라면 Recovery CallBack을 호출한다.

이때 결과는 Chunk에 쓰이게 된다.

4. 다시 Exception이 발생하면, Retry를 체크해서 가능하다면 BackoffciePolicy를 통해 다시 RepeatTemplate을 통해 처음으로 돌아가 RetryTemplate을 통해 Retry 여부를 체크한다. 

5. 불가 케이스때는 Step 을 실패 처리한다.

 

Retry Policy는 아래와 같이 동작한다.

skip과 유사하게 Classifier는 Map의 형태를 가지고 있고 아래의 두가지를 체크해서 retry 를 한다.

 

1. Retry가 가능한 Exception 인지

2. Retry 가 가능한 재시도 횟수인지

 

 

재시도 정책에 대해서도, 여러가지가 존재한다.

-최초 한번만 허용, 그 이후로는 재시도 불가

-주어진 시간동안만 재시도 허용

-재시도 횟수에 따라서 재시도 허용

-재시도 횟수 및 예외 종류에 따라서 재시도 허용

 

특이한 재시도 정책은, 최초 한번만 재시도 허용, 그 이후로는 재시도 불가이다.

NeverRetryPolicy 여서 이름은 절대 안할 것같지만,최초 한번만 허용하고, 그 이후 재시도를 불가하게 한다.

 

BackofficePolicy는 재시도 간의 시간 텀을 둘 수 있다.

최초Exception이 밝생한 뒤에 다시 해당 재처리가 발생되는 경우에 BackoffciePolicy에서 대기 텀을 적용하면

해당 시간 이후에 재시도를 요청 할 수 있다.

간단한 구현 예이다.

 

 

총 재시도 횟수가 끝나면, Recovery Callback이 호출이된다.

즉 모든 Item은 retry 만큼 재시도를 할 수 있다.

다시 자세히 말하면, 각 아이템을 처리하고 2번에서 만약에 Exception이 발생한다면

Input chunk에서 Exception이 발생한 요소를 삭제 (Skip) 하고

다음 요소로 온다. 총 카운트는 Context에서 체크를 해서 재시도 여부를 판단한다.

 

<정리>

각 Item에 대해서 Retry Context가 생성된다.

각 Retry Context는 시도 횟수를 가지고 있다. 이 시도가 끝나면 Recovery Call을 호출한다.

Recovery Call이 호출되면, skip이 된다. 해당 input chunk에서 item을 제거하고

Retry를 하기 때문에, 해당 아이템에 대한 skip 처리가 된다고 이해하면된다.

 

 

반응형

'Develop > [Spring Batch]' 카테고리의 다른 글

[Spring Batch] MultiThread vs partioning  (0) 2022.04.10
[Spring Batch] Chunk란?  (0) 2022.04.10
[Spring Batch] How to FailOver(Skip)  (0) 2022.04.10
[Spring Batch] Not Use in Meta Tables  (0) 2022.04.10
[Spring Batch] Meta Tables  (0) 2022.04.10