모르지 않다는 것은 아는것과 다르다.

Spring Batch

Skip, Retry

채마스 2022. 2. 27. 01:24

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이 발생하면 실행된다.




'Spring Batch' 카테고리의 다른 글

성능 평가 Async Step vs Multi-Thread Step vs Partition Step vs Parallel Step  (0) 2022.02.27
JobExecutionDecider  (0) 2022.02.27
StepListener  (0) 2022.02.27
JobExecutionListener  (0) 2022.02.27
ItemWriter  (0) 2022.02.27