首页 > 解决方案 > Spring Batch Conditional Flow - 第二个流总是进入状态 FAILED

问题描述

我创建了一个 Spring Batch 应用程序,我正在努力实现一个带有条件的简单流程。这是我想要实现的:

在此处输入图像描述

我试图实现这一点,实现以下代码:

@Bean
public Job job(JobCompletionNotificationListener listener) {
    return jobs.get(Constants.JOB_SIARD_FILES_PROCESSOR + new Date().getTime())
        .incrementer(new RunIdIncrementer())
        .listener(listener)
        .start(step1())
        .next(decider()).on("yes").to(step2345Flow())
        .end()
        .build();
}

@Bean
public Flow step2345Flow() {
    return new FlowBuilder<SimpleFlow>("yes_flow")
        .start(step2())
        .next(step3())
        .next(step4())
        .next(step5())
        .build();
}

当条件为“是”时,流程工作得很好,但当条件为“否”时,流程总是以执行状态“失败”结束。我希望它像第一个流程一样“完成”,但不执行步骤 2、3、4 和 5。

希望任何人都可以帮助我。

标签: spring-bootspring-batch

解决方案


Spring Batch 不允许流中的替代分支是隐式的。换句话说,您需要on(...)针对每种情况。

假设decider()产生一个代理bean,它应该可以正常工作

@Bean
public Job job(JobCompletionNotificationListener listener) {
    return jobs.get(Constants.JOB_SIARD_FILES_PROCESSOR + new Date().getTime())
        .incrementer(new RunIdIncrementer())
        .listener(listener)
        .start(step1())
        .next(decider()).on("yes").to(step2345Flow())
        .from(decider()).on("no").end()
        .end()
        .build();
}

要涵盖所有情况,您还可以使用on("*")代替on("no").

另请查看官方文档:https ://docs.spring.io/spring-batch/docs/4.3.x/reference/html/index-single.html#controllingStepFlow


推荐阅读