每一个job都有一个或多个step,每个step都有执行状态,标识step的批处理是都完成。
在Spring batch框架中已经内置了一个RepeatStatus枚举类,定义了执行step的几个状态。
1、FINISHED终止状态
如果一个step执行状态为FINISHED状态,表示该step执行完毕。看下面示例,一个job分两步执行,step1和step2。
@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 begin process...");
System.out.println("step1 is processing...");
System.out.println("step1 end process...");
/*step1的执行状态为FINISHED,表示结束step1的执行*/
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 begin process...");
System.out.println("step2 is processing...");
System.out.println("step2 end process...");
/*step2的执行状态为FINISHED,表示结束step2的执行*/
return RepeatStatus.FINISHED;
}).build();
return step;
}
/*
start(step2())用于启动一个step2;
next(step1()),当step2()执行完毕后,再执行step1();
*/
@Bean
public Job job1(){
Job job = jobBuilderFactory.get("job1")
.start(step2())
.next(step1())
.build();
return job;
}
}
运行该批处理实例,输出日志如下:
[This is step1]
[This is step2]
……省略日志
2018-02-26 13:58:34.566 INFO 15044 --- [ main] o.s.batch.core.job.SimpleStepHandler : Executing step: [step2]
step2 begin process...
step2 is processing...
step2 end process...
2018-02-26 13:58:34.588 INFO 15044 --- [ main] o.s.batch.core.job.SimpleStepHandler : Executing step: [step1]
step1 begin process...
step1 is processing...
step1 end process...
从输出日志可以看出,先执行了step2,step2结束后执行的step1。FINISHED就是用来标识一个step的结束的
2、CONTINUABLE连续状态
如果一个step的状态设置了CONTINUABLE了,表示连续执行该step。看下面示例,一个job分两步执行,step1和step2。
@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 begin process...");
System.out.println("step1 is processing...");
System.out.println("step1 end 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 begin process...");
System.out.println("step2 is processing...");
System.out.println("step2 end process...");
/*step2的执行状态设置了CONTINUABLE,表示连续不断的执行step2,没有终止状态*/
return RepeatStatus.CONTINUABLE;
}).build();
return step;
}
@Bean
public Job job1(){
Job job = jobBuilderFactory.get("job1")
.start(step2())
.next(step1())
.build();
return job;
}
}
运行该批处理示例,日志输出如下:
[This is step1]
[This is step2]
……省略日志
step2 begin process...
step2 is processing...
step2 end process...
step2 begin process...
step2 is processing...
step2 end process...
step2 begin process...
step2 is processing...
step2 end process...
……省略日志,后面为循环不断执行的step2的日志
从输出的日志可以看出,在启动step2后,就循环不断的执行的step2,没有终止。CONTINUABLE的作用就是标识一个step循环执行。
如果要控制step2的循环次数的话,也可以设置一个变量,根据变量的值进行循环
private static int i = 0;
@Bean
public Step step2(){
System.out.println("[This is step2]");
Step step = stepBuilderFactory.get("step2").tasklet((contribution, chunkContext) -> {
System.out.println("step2 begin process...");
System.out.println("step2 is processing...");
System.out.println("step2 end process...");
/*只循环执行四次step2就退出了*/
if (++i < 5) {
return RepeatStatus.CONTINUABLE;
}else {
return RepeatStatus.FINISHED;
}
}).build();
return step;
}
3、continueIf(boolean continuable)条件状态
如果一个step的状态设置成了continueIf(boolean continuable),会根据continuable来判断执行的状态。如果continuable为true,表示继续执行该step,如果为false,表示终止s该step的执行。从源码中可以看出
public static RepeatStatus continueIf(boolean continuable) {
return ((continuable) ? CONTINUABLE : FINISHED);
}
当continuable为true时,执行状态为CONTINUABLE;continuable为false时,执行状态为FINISHED。
如下示例
private static int i = 0;
@Bean
public Step step2(){
System.out.println("[This is step2]");
Step step = stepBuilderFactory.get("step2").tasklet((contribution, chunkContext) -> {
System.out.println("step2 begin process...");
System.out.println("step2 is processing...");
System.out.println("step2 end process...");
/*当连续执行两次step2后,(++i)/2 == 0的条件变为false,执行状态变为FINISHED,终止step2的执行*/
return RepeatStatus.continueIf((++i)/2 == 0);
}).build();
return step;
}
4、and(boolean value)条件状态
该条件状态不常用,从源码中看出
public RepeatStatus and(boolean value) {
return (((value) && (this.continuable)) ? CONTINUABLE : FINISHED);
}
如果当前step的状态为continuable,然后设置的boolean value条件值是true,才会得到CONTINUABLE ,继续执行该step,否则终止该step的运行。