From ac3587491d2892fbbffc0c12e0017ccba163c52d Mon Sep 17 00:00:00 2001 From: haerong22 Date: Thu, 16 Jun 2022 01:49:42 +0900 Subject: [PATCH] #11 spring batch: TaskleStep api - startLimit(), allowStartIfComplete() --- .../basic/step/Limit_AllowConfiguration.java | 82 +++++++++++++++++++ .../basic/step/TaskletConfiguration.java | 6 +- 2 files changed, 85 insertions(+), 3 deletions(-) create mode 100644 spring-batch/basic/src/main/java/io/springbatch/basic/step/Limit_AllowConfiguration.java diff --git a/spring-batch/basic/src/main/java/io/springbatch/basic/step/Limit_AllowConfiguration.java b/spring-batch/basic/src/main/java/io/springbatch/basic/step/Limit_AllowConfiguration.java new file mode 100644 index 00000000..358407ba --- /dev/null +++ b/spring-batch/basic/src/main/java/io/springbatch/basic/step/Limit_AllowConfiguration.java @@ -0,0 +1,82 @@ +package io.springbatch.basic.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.launch.support.RunIdIncrementer; +import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.tasklet.Tasklet; +import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +@RequiredArgsConstructor +public class Limit_AllowConfiguration { + + private final JobBuilderFactory jobBuilderFactory; + private final StepBuilderFactory stepBuilderFactory; + + @Bean + public Job batchJob() { + return jobBuilderFactory.get("batchJob") + .incrementer(new RunIdIncrementer()) + .start(step1()) + .next(step2()) + .next(step3()) + .build(); + } + + /* + startLimit() + + - Step 의 실행 횟수를 조정 + - Step 마다 설정 가능 + - 설정 값을 초과해서 다시 실행하려고 하면 StartLimitExceededException 발생 + - 디폴트는 Integer.MAX_VALUE + + allowStartIfComplete() + + - 재시작 가능한 job 에서 step 의 이전 성공 여부와 상관없이 항상 step 을 실행하기 위한 설정 + - 실행 마다 유효성을 검증하는 Step 이나 사전 작업이 꼭 필요한 Step 등에 사용 + - 기본적으로 COMPLETED 상태를 가진 Step 은 Job 재시작시 실행하지 않고 스킵 + - true 로 설정 된 step 은 항상 실행 + + */ + @Bean + public Step step1() { + return stepBuilderFactory.get("step1") + .tasklet(new Tasklet() { // 익명 클래스 + @Override + public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { + System.out.println("step1 was executed"); + return RepeatStatus.FINISHED; + } + }) + .allowStartIfComplete(true) + .build(); + } + + @Bean + public Step step2() { + return stepBuilderFactory.get("step2") + .tasklet((contribution, chunkContext) -> { // 람다 + System.out.println("step2 was executed"); + + throw new RuntimeException("step2 was failed"); +// return RepeatStatus.FINISHED; + }) + .startLimit(3) + .build(); + } + + @Bean + public Step step3() { + return stepBuilderFactory.get("step3") + .tasklet(new CustomTasklet()) // 구현 클래스 + .build(); + } +} diff --git a/spring-batch/basic/src/main/java/io/springbatch/basic/step/TaskletConfiguration.java b/spring-batch/basic/src/main/java/io/springbatch/basic/step/TaskletConfiguration.java index 88578fca..bbf11cde 100644 --- a/spring-batch/basic/src/main/java/io/springbatch/basic/step/TaskletConfiguration.java +++ b/spring-batch/basic/src/main/java/io/springbatch/basic/step/TaskletConfiguration.java @@ -14,7 +14,7 @@ import org.springframework.batch.repeat.RepeatStatus; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -@Configuration +//@Configuration @RequiredArgsConstructor public class TaskletConfiguration { @@ -60,9 +60,9 @@ public class TaskletConfiguration { @Bean public Step step2() { - return stepBuilderFactory.get("step3") + return stepBuilderFactory.get("step2") .tasklet((contribution, chunkContext) -> { // 람다 - System.out.println("step3 was executed"); + System.out.println("step2 was executed"); return RepeatStatus.FINISHED; }) .build();