ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 25. Skip
    BackEnd/Spring Batch 2022. 1. 6. 21:48
    반응형

      Skip은 데이터를 처리하는 동안 설정된 Exception이 발생했을 경우, 해당 데이터 처리를 건너뛰는 기능입니다.

    • ItemReader: 예외가 발생하면 해당 아이템만 스킵하고 계속 진행
    • ItemProcessor, ItemWriter: 예외가 발생하면 Chunk의 처음으로 돌아가서 스킵된 아이템을 제외한 나머지 아이템들을 가지고 처리

     

      Skip 기능은 내부적으로 SkipPolicy를 통해서 구현되어 있으며, Skip 가능 여부 판단 기준은 아래와 같습니다.

        1. 스킵 대상에 포함된 예외인지 여부 (skippableException)

        2. 스킵 카운터를 초과 했는지 여부 (skipCount > skipLimit, skipCount는 ItemReader, ItemProcessor, ItemWriter 합

     

    SkipPolicy

      Skip 정책에 따라 아이템의 skip 여부를 판단하는 클래스입니다. 스프링 배치가 기본적으로 제공하는 SkipPolicy 구현체들이 있으며, 필요 시 직접 생성해서 사용할 수 있습니다. 내부적으로 Classfier 클래스들을 활용하고 있습니다.

     

    API

    package io.springbatch.springbatchlecture;
    
    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.configuration.annotation.StepScope;
    import org.springframework.batch.core.launch.support.RunIdIncrementer;
    import org.springframework.batch.core.step.skip.LimitCheckingItemSkipPolicy;
    import org.springframework.batch.core.step.skip.NeverSkipItemSkipPolicy;
    import org.springframework.batch.core.step.skip.SkipException;
    import org.springframework.batch.item.ItemReader;
    import org.springframework.batch.item.support.ListItemReader;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    @RequiredArgsConstructor
    @Configuration
    public class SkipConfiguration {
    
        private final JobBuilderFactory jobBuilderFactory;
        private final StepBuilderFactory stepBuilderFactory;
    
        @Bean
        public Job job() throws Exception {
            return jobBuilderFactory.get("batchJob")
                    .incrementer(new RunIdIncrementer())
                    .start(step1())
                    .build();
        }
    
        @Bean
        public Step step1() throws Exception {
            return stepBuilderFactory.get("step1")
                    .<String, String>chunk(5)
                    .reader(new ItemReader<String>() {
                        int i = 0;
                        @Override
                        public String read() throws SkippableException {
                            i++;
                            if(i == 3) {
                                throw new SkippableException("skip");
                            }
                            System.out.println("ItemReader : " + i);
                            return i > 20 ? null : String.valueOf(i);
                        }
                    })
                    .processor(processor())
                    .writer(writer())
                    .faultTolerant()
    //                .noSkip(SkippableException.class) // 아래 설정이 위의 설정을 덮어씀, skip() 설정이 우선
    //                .skipPolicy(limitCheckingItemSkipPolicy())
    //                .retry(SkippableException.class)
    //                .retryLimit(2)
                    .skip(SkippableException.class)
                    .skipLimit(2)
    //                .noRollback(SkippableException.class)
                    .build();
        }
    
        @Bean
        public LimitCheckingItemSkipPolicy limitCheckingItemSkipPolicy(){
    
            Map<Class<? extends Throwable>, Boolean> skippableExceptionClasses = new HashMap<>();
            skippableExceptionClasses.put(SkippableException.class, true);
    
            LimitCheckingItemSkipPolicy limitCheckingItemSkipPolicy = new LimitCheckingItemSkipPolicy(3, skippableExceptionClasses);
    
            return limitCheckingItemSkipPolicy;
        }
    
        @Bean
        public SkipItemProcessor processor() {
            SkipItemProcessor processor = new SkipItemProcessor();
            return processor;
        }
    
        @Bean
        public SkipItemWriter writer() {
            SkipItemWriter writer = new SkipItemWriter();
            return writer;
        }
    }

    [전체 소스코드]

     

    [참고자료]

    인프런-스프링 배치 - Spring Boot 기반으로 개발하는 Spring Batch

    반응형

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

    27. Skip & Retry Architect  (0) 2022.01.07
    26. Retry  (0) 2022.01.07
    24. FaultTolerant  (0) 2022.01.04
    23. Repeat  (0) 2022.01.04
    22. ItemProcessor  (0) 2022.01.04

    댓글

Designed by Tistory.