복붙노트

[SPRING] 스프링 배치에서 x 번 반복

SPRING

스프링 배치에서 x 번 반복

Spring Batch 3.0.3을 사용하여 주석을 설정하여 단계를 미확인 횟수만큼 반복하는 배치 작업을 생성합니다.

나의 첫 번째 단계는 반복 단계에서 사용 된 항목 목록을 메모리에 읽어 들일 것입니다. 이 작업 범위 목록을 반복하는 단계를 반복하고 싶습니다.

동일한 단계를 x 번 실행하도록 작업을 구성하려면 어떻게해야합니까? 나는 xml에서 다음 단계를 지정하는 예제를 보았다. 목록이 반복 될 때까지 무한 루프에서 두 단계를 서로 가리킬 수 있다고 생각합니다. 이 방법이 효과가 있으며 주석을 사용하여이를 수행 할 수 있습니까? 아래는 작동하지 않는 일부 코드가 포함 된 주요 구성 파일입니다.

@ComponentScan(excludeFilters = @Filter(IgnoreDuringScan.class))
@EnableAutoConfiguration
@EnableBatchProcessing
@Loggable
public class BatchCrudConfiguration
{
    @Bean
    public Job batchCRUDJob(JobBuilderFactory jobBuilderFactory, Step[] processSheetSteps)
    {
        JobBuilder jobBuilder = jobBuilderFactory.get("batchCRUDJob").incrementer(new RunIdIncrementer());
        FlowBuilder<FlowJobBuilder> jobFlowBuilder = jobBuilder.flow(processSheetSteps[0]);
        for (int i = 1; i < processSheetSteps.length; i++)
        {
            jobFlowBuilder = jobFlowBuilder.next(processSheetSteps[i]);
        }
        return jobFlowBuilder.end().build();
    }

    @Bean
    public Step[] processSheetSteps(
            StepBuilderFactory stepBuilderFactory,
            RawDataReader[] readers,
            DelegatingWriter writer,
            DelegatingProcessor processor,
            @Value("${batchcrud.chunkSize}") int chunkSize)
    {
        int numberOfReaders = readers.length;
        Step[] steps = new Step[numberOfReaders];
        for (int i = 0; i < numberOfReaders; i++)
        {
            steps[i] = stepBuilderFactory.get("processSheet" + i + "Step").<RawData, DataItem>
                    chunk(chunkSize).reader(readers[i]).processor(processor).writer(writer).build();
        }
        return steps;
    }

해결법

  1. ==============================

    1.이렇게 접근하는 방법은 다음과 같습니다.

    이렇게 접근하는 방법은 다음과 같습니다.

    예 :

    StepExecutionListener

    public class MyListener {
    
        @Autowired
        private List myItems;
    
        @AfterStep
        public ExitStatus afterStep(StepExecution stepExecution) {
            if(myItems.size() > 0) {
                return new ExitStatus("CONTINUE");
            }
            else {
                return new ExitStatus("FINISHED");
            }
        }
    }
    

    작업 구성

    ...
    @Bean
    public Step step1() {...}
    
    @Bean
    public MyListener listener() {..}
    
    @Bean
    public Step step2(MyListener listener) {
        return stepBuilder.get("step2")
                    .tasklet(myTasklet()) // Replace this piece as needed
                    .listener(listener).build();
    }
    
    @Bean
    public Job job1(Step step1, Step step2) {
        return jobBuilder.get("job1")
                         .start(step1)
                         .next(step2).on("CONTINUE").to(step2).on("FINISHED").end()
                         .build();
    }
    ...
    

    참고 오타가있을 수 있으므로이 코드를 테스트하지 않았습니다.

  2. from https://stackoverflow.com/questions/29286699/repeating-a-step-x-times-in-spring-batch by cc-by-sa and MIT license