[SpringBatch] COMPLETED된 Step도 Job 재실행 대상에 포함하기 -allowStartIfComplete

반응형
728x90
반응형

Job 재실행

Job의 재실행에 대해서는 아래 포스팅을 참고하자.

https://devfunny.tistory.com/680

 

SpringBatch 에서 JobInstance, JobExecution 의 관계

들어가기전 JobInstance, JobExecution 의 개념은 알고가자. https://devfunny.tistory.com/476?category=820618 [스프링배치] 잡의 실행 (JobLauncher, JobInstance, JobExecution, JobParameters) 잡의 실행 잡..

devfunny.tistory.com

 

JOB을 재실행하면 FAILED 상태로 끝난 STEP만 실행 대상이 되는데, allowStartIfComplete(true)를 사용하여 COMPLETED로 끝난 STEP도 재실행 대상에 포함시킬 수 있다.

 

 

 

 

예제코드

  • AllowStartConfiguration.java
package com.spring.batch.step;

import lombok.RequiredArgsConstructor;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.item.ItemProcessor;
import org.springframework.batch.item.ItemWriter;
import org.springframework.batch.item.support.ListItemReader;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Arrays;
import java.util.List;

/*
--job.name=limitAllowStepJob
 */

@Configuration
@RequiredArgsConstructor
public class AllowStartConfiguration {

    // job 생성
    private final JobBuilderFactory jobBuilderFactory;
    private final StepBuilderFactory stepBuilderFactory;

    @Bean
    public Job limitAllowStepJob() {
        return this.jobBuilderFactory.get("limitAllowStepJob")
                .start(limitAllowStepStep1())// COMPLETED (재시작에 포함되지 않음) -> allowStartIfComplete 추가 후 포함됨
                .next(limitAllowStepStep2())// FAILED (재시작의 대상)
                .build();
    }

    @Bean
    public Step limitAllowStepStep1() {
        return stepBuilderFactory.get("limitAllowStepStep1")
                .tasklet(new Tasklet() {
                    @Override
                    public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
                        System.out.println("limitAllowStepStep1");
                        return RepeatStatus.FINISHED;
                    }
                })
                .allowStartIfComplete(true) // COMPLETED 되도 재실행에 포함
                .build();
    }

    @Bean
    public Step limitAllowStepStep2() {
        return stepBuilderFactory.get("limitAllowStepStep2")
                .tasklet(new Tasklet() {
                    @Override
                    public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
                        System.out.println("limitAllowStepStep2");
                        throw new RuntimeException("step2 was failed");
                        //return RepeatStatus.FINISHED;
                    }
                })
                .build();
    }
}

 

Step1 이 COMPLETED 상태로 종료했지만, 설정값에 의해 Job이 재실행될때 Step1 도 다시 수행된다.

 

.allowStartIfComplete(true)

 

 

반응형

Designed by JB FACTORY