批处理的执行状态 -> RepeatStatus

每一个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的运行。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值