Skip 예외처리
- step 수행 중 발생한 특정 Exception과 에러 횟수 설정으로 예외처리 설정
- 만약 skip(NotFoundNameException.class), skipLimit(3)으로 설정한다면
- NotFoundNameException이 3번 발생할 때까지는 에러를 skip 한다.
- 4번째에서 Job과 Step의 상태가 실패로 끝나며, 배치가 중지된다.
- 여기서 에러 발생 전까지는 모두 정상처리된 상태로 남는다.
- 그렇기 때문에 오류가 난 다음부터 다시 시작해야 된다. -> 안 그러면 중복이 발생함
- ex> 10개의 chunk 중 1~9까지 정삭으로 작동하고 10에서 오류가 났다면 -> 배치 재 실행 시 10번째 chunk부터 처리하도록 배치를 구현해야 된다.
.faultTolerant()
.skip(NotFoundNameException.class)
.skiplimit(3)
- Step을 구현한 부분에서 다음과 같이 설정해 줄 수 있다.
- faultTolerant() 뒤에 설정해야 된다.
Retry 예외 처리
- Step 수행 중 간헐적으로 Exception 발생 시 재시도(retry) 설정
- DB Deadlock, Network timeout 등
- 만약 retry(NullPointerException.class), retryLimit(3)으로 설정한다면
- NullPointerException이 발생할 경우 3번까지 재시도한다.
- 더 구체적으로 retry를 정의하면 RetryTemplate 이용
//기본 생성자에서 retry template 초기화 진행
public PersonValidationRetryProcessor(RetryTemplate retryTemplate) {
this.retryTemplate = new RetryTemplateBuilder()
.maxAttempts(3)
.retryOn(NotFoundException.class)
.build();
}
//3번 만큼 RetryCallback이 실행되고
//그 이상인 경우 RecoveryCallBack 이 실행된다.
@Override
public Person process(Person item) throws Exception {
return this.retryTemplate.execute(context -> {
//RetryCallback -> retry template 의 첫 시작점
if(item.isNotEmptyName()){
return item;
}
throw new NotFoundNameException();
},context -> {
//RecoveryCallback
return item.unKnownName();
});
}
- maxAttempts에서 3으로 설정했다면
- NotFoundException이 3번 발생할 동안은 RetryCallback을 진행하고
- 그 이후에는 RecoveryCallback을 진행한다.
- RetryListener
public static class SaverPersonRetryListener implements RetryListener {
//Retry를 시작하는 설정
@Override
public <T, E extends Throwable> boolean open(RetryContext context, RetryCallback<T, E> callback) {
return true; // true 여야만 retry가 실행된다.
}
//Retry 종료후에 호출된다.
@Override
public <T, E extends Throwable> void close(RetryContext context, RetryCallback<T, E> callback, Throwable throwable) {
log.info("close");
}
// retry template에 정의한 exception이 발생하면 실행된다.
@Override
public <T, E extends Throwable> void onError(RetryContext context, RetryCallback<T, E> callback, Throwable throwable) {
log.info("error");
}
}
- open 메서드는 Retry를 시작하는 설정이다. -> true여야만 retry가 실행된다.
- close 메서드는 Retry 종료 후에 실행된다.
- onError 메서드는 Retry Template에 정의한 exception이 발생하면 실행된다.