Coding/Spring Batch
[SpringBatch] COMPLETED된 Step도 Job 재실행 대상에 포함하기 -allowStartIfComplete
shbada
2022. 2. 15. 23:36
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)
반응형