-
26. RetryBackEnd/Spring Batch 2022. 1. 7. 20:13반응형
Retry는 ItemProcess, ItemWriter에서 설정된 Exception이 발생했을 경우, 지정한 정책에 따라 데이터 처리를 재시도하는 기능입니다. 오류 발생 시 Chunk 단계의 처음부터 다시 시작하며, ItemReader에서 캐시로 저장한 값을 사용합니다.
Retry 기능은 내부적으로 RetryPolicy를 통해 구현되어 있으며, Retry 가능 여부를 판별하는 기준은 다음과 같습니다.
1. 재시도 대상에 포함된 예외인지 여부 (retryableException)
2. 재시도 카운터를 초과 했는지 여부 (retryCount > retryLimit)
RetryPolicy
재시도 정책에 따라 아이템의 retry 여부를 판단하는 클래스입니다. 기본적으로 제공하는 RetryPolicy 구현체들이 있으며 필요 시 직접 생성해서 사용할 수 있습니다.
BackOffPolicy
RetryPolicy와 BackOffPolicy를 사용해서 재시도 정책을 설정합니다. 처리시간이 긴 데이터가 있을 경우 backOffPolicy로 재시도의 시간 간격을 조정할 수 있습니다.
API
package io.springbatch.springbatchlecture.api; import io.springbatch.springbatchlecture.*; import io.springbatch.springbatchlecture.template.Customer; import lombok.RequiredArgsConstructor; import org.springframework.batch.core.*; import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; import org.springframework.batch.core.launch.support.RunIdIncrementer; import org.springframework.batch.item.ItemProcessor; import org.springframework.batch.item.ItemWriter; import org.springframework.batch.item.support.ListItemReader; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.retry.policy.SimpleRetryPolicy; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @RequiredArgsConstructor @Configuration public class RetryConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; @Bean public Job job() throws Exception { return jobBuilderFactory.get("batchJob1") .incrementer(new RunIdIncrementer()) .start(step1()) .build(); } @Bean public Step step1() throws Exception { return stepBuilderFactory.get("step1") .<String, Customer>chunk(5) .reader(reader()) .processor(processor()) .writer(writer()) .faultTolerant() // .skip(RetryableException.class) // .skipLimit(2) .retry(RetryableException.class) .noRetry(NoRetryException.class) .retryLimit(2) .build(); } @Bean public SimpleRetryPolicy limitCheckingItemSkipPolicy() { Map<Class<? extends Throwable>, Boolean> exceptionClass = new HashMap<>(); exceptionClass.put(RetryableException.class, true); SimpleRetryPolicy simpleRetryPolicy = new SimpleRetryPolicy(2, exceptionClass); return simpleRetryPolicy; } @Bean public ListItemReader<String> reader() { List<String> items = new ArrayList<>(); for(int i = 0; i < 30; i++) { items.add(String.valueOf(i)); } return new ListItemReader<>(items); } @Bean public ItemProcessor processor() { RetryItemProcessor processor = new RetryItemProcessor(); return processor; } @Bean public ItemWriter writer() { RetryItemWriter writer = new RetryItemWriter(); return writer; } }
전체 소스코드는 첨부된 링크의 api 패키지를 참고하시면 됩니다. template 패키지는 RetryTemplate을 사용한 예제 코드입니다.
[참고자료]
반응형'BackEnd > Spring Batch' 카테고리의 다른 글
28. 멀티 스레드 프로세싱 (Multi Thread Processing) (0) 2022.01.08 27. Skip & Retry Architect (0) 2022.01.07 25. Skip (0) 2022.01.06 24. FaultTolerant (0) 2022.01.04 23. Repeat (0) 2022.01.04