package cn.tedu.boot41.config;
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.EnableBatchProcessing;
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.repeat.RepeatStatus;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* jobFlow工作流。
*/
@Configuration
@EnableBatchProcessing
public class JobFlowDemoOne {
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
// 创建job
@Bean
public Job JobFlowDemo1() {
return jobBuilderFactory.get("JobFlowDemo1")
.start(step1())
.next(step2())
.next(step3())
// .start(step1())
// // on 状态, 根据step1()参数的key到completed的时候执行step2
// .on("COMPLETED").to(step2())
// .from(step2()).on("COMPLETED").to(step3())
// .from(step3()).end()
.build();
// .fail() 结束,后续不会执行到。
// .stopAndRestart(step3()) 逻辑判读在执行
}
// 创建Step
@Bean
public Step step1() {
return stepBuilderFactory.get("step1")
// tasklet 接口只有一个抽象方法@Nullable类,可以简化内部类
.tasklet((contribution,context) -> {
System.out.println("step1");
return RepeatStatus.FINISHED;
}).build();
}
@Bean
public Step step2() {
return stepBuilderFactory.get("step2")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
System.out.println("step2");
//RepeatStatus status可重复的 如果任务失败了下次可以再次运行。
return RepeatStatus.FINISHED;
}
}).build();
}
@Bean
public Step step3() {
return stepBuilderFactory.get("step3")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
System.out.println("step3");
//RepeatStatus status可重复的 如果任务失败了下次可以再次运行。
return RepeatStatus.FINISHED;
}
}).build();
}
}
如何用FlowBuilder定义Flow并且在Job中使用。
package cn.tedu.boot41.config;
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.EnableBatchProcessing;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.job.builder.FlowBuilder;
import org.springframework.batch.core.job.flow.Flow;
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.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* jobFlow工作流。
*/
@Configuration
@EnableBatchProcessing
public class JobFlowDemoTwo {
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
// 创建Step
@Bean
public Step step1() {
return stepBuilderFactory.get("step1")
// tasklet 接口只有一个抽象方法@Nullable类,可以简化内部类
.tasklet((contribution,context) -> {
System.out.println("step1");
return RepeatStatus.FINISHED;
}).build();
}
@Bean
public Step step2() {
return stepBuilderFactory.get("step2")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
System.out.println("step2");
return RepeatStatus.FINISHED;
}
}).build();
}
@Bean
public Step step3() {
return stepBuilderFactory.get("step3")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
System.out.println("step3");
return RepeatStatus.FINISHED;
}
}).build();
}
@Bean
public Flow jobFlowDemoFlow1() {
return new FlowBuilder<Flow>("jobFlowDemoFlow1")
.start(step1())
.next(step2())
.build();
}
@Bean
public Job jobFlowDemoTwoJob(){
return jobBuilderFactory.get("jobFlowDemoTwoJob")
.start(jobFlowDemoFlow1())
.next(step3())
.end()
.build();
}
}