不同的job之间有时都需要相同的几个step,并且调用step之间的顺序也是相同的,此时可以把这几个step组成一个flow会方便调用。一个job可以由flow和step共同组成。
flow流和flow流或者和tep步骤之间是可以进行跳转的,具体方法同上一章节作业步骤跳转相同,next()、from()、on()、to()同样适用。
下面看一下,step、flow和决策者之间的相互跳转
首先定义一个决策者
package com.lzj.spring.flow;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.job.flow.FlowExecutionStatus;
import org.springframework.batch.core.job.flow.JobExecutionDecider;
public class StepDecider implements JobExecutionDecider{
private Boolean flag;
public StepDecider(Boolean flag) {
this.flag = flag;
}
@Override
public FlowExecutionStatus decide(JobExecution jobExecution, StepExecution stepExecution) {
System.out.println("StepDecider决策者开始执行……");
if (flag) {
System.out.println("条件是name");
return new FlowExecutionStatus("name");
}else {
System.out.println("条件是password");
return new FlowExecutionStatus("password");
}
}
}
step、flow、决策者之间的跳转配置
package com.lzj.spring.flow;
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
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.job.flow.JobExecutionDecider;
import org.springframework.batch.core.launch.support.RunIdIncrementer;
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;
/*@EnableBatchProcessing注解也可以加在spring boot的启动类上*/
@EnableBatchProcessing
@Configuration
public class BatchConfig {
/*自动注入Step的工厂类,用于生成step*/
@Autowired
private StepBuilderFactory stepBuilderFactory;
/*自动注入Job的工厂类,用于生成job*/
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Bean
public Step step1(){
System.out.println("[This is step1]");
Step step = stepBuilderFactory.get("step1").tasklet((contribution, chunkContext) -> {
System.out.println("step1 process...");
return RepeatStatus.FINISHED;
}).build();
return step;
}
@Bean
public Step step2(){
System.out.println("[This is step2]");
Step step = stepBuilderFactory.get("step2").tasklet((contribution, chunkContext) -> {
System.out.println("step2 process...");
return RepeatStatus.FINISHED;
}).build();
return step;
}
@Bean
public Step step3(){
System.out.println("[This is step3]");
Step step = stepBuilderFactory.get("step3").tasklet((contribution, chunkContext) -> {
System.out.println("step3 process...");
return RepeatStatus.FINISHED;
}).build();
return step;
}
@Bean
public JobExecutionDecider getDecider(){
return new StepDecider(true);
}
<!--定义flow1,flow1有step2、决策者组成-->
@Bean
public Flow flow1(){
return new FlowBuilder<Flow>("flow1")
.start(step2()) //可以start开始一个step、flow、决策者
.from(step2()).on(ExitStatus.COMPLETED.getExitCode()).to(getDecider())
.from(getDecider()).on("name").to(step1()) //可以to到一个step、flow、决策者
.build();
}
/*job1由flow1和step3组成*/
@Bean
public Job job1(){
Job job = jobBuilderFactory.get("job1")
.start(flow1())
.on(ExitStatus.COMPLETED.getExitCode()).to(step3())
.end()
.build();
return job;
}
}
运行该作业,输出日志
……省略日志
2018-03-01 09:45:52.203 INFO 9608 --- [ main] o.s.batch.core.job.SimpleStepHandler : Executing step: [step2]
step2 process...
StepDecider决策者开始执行……
条件是name
2018-03-01 09:45:52.250 INFO 9608 --- [ main] o.s.batch.core.job.SimpleStepHandler : Executing step: [step1]
step1 process...
2018-03-01 09:45:52.279 INFO 9608 --- [ main] o.s.batch.core.job.SimpleStepHandler : Executing step: [step3]
step3 process...