如何使 Spring 批处理步骤取决于上一步?

How to make a Spring Batch step depends on previous step?

我正在使用 Spring Batch 从 CSV 文件中读取一些数据并将其放入数据库中。 我的批处理作业必须包含 2 个步骤:

  1. 检查文件(名称、扩展名、内容..)
  2. 从 CSV 中读取行并将它们保存在数据库中(ItemReader、ItemProcessor、 ItemWriter..)

Step 2 如果 Step 1 产生错误(文件不符合,文件不存在...)

则不得执行

仅供参考,我正在使用 Spring 没有 XML 配置的批处理!只有注释: 这是我的工作配置 class 的样子:

@Configuration
@EnableBatchProcessing
public class ProductionOutConfig {

    @Autowired
    private StepBuilderFactory steps;

    @Autowired
    private JobBuilderFactory jobBuilderFactory;


    @Autowired
    private ProductionOutTasklet productionOutTasklet;

    @Autowired
    private CheckFilesForProdTasklet checkFilesForProdTasklet;

    @Bean
    public Job productionOutJob(@Qualifier("productionOut")Step productionOutStep,
                                @Qualifier("checkFilesForProd") Step checkFilesForProd){
        return jobBuilderFactory.get("productionOutJob").start(checkFilesForProd).next(productionOutStep).build();
    }

    @Bean(name="productionOut")
    public Step productionOutStep(){
        return steps.get("productionOut").
                tasklet(productionOutTasklet)
                .build();}

    @Bean(name = "checkFilesForProd")
    public Step checkFilesForProd(){
        return steps.get("checkFilesForProd")
                .tasklet(checkFilesForProdTasklet)
                .build();
    }
}

如文档所述,您可以使用 "on" 方法,如果先前状态的退出状态与给定模式匹配,则该方法开始转换到新状态。

您的代码可能类似于以下内容:

    return jobBuilderFactory.get("productionOutJob")
           .start(checkFilesForProd)
           .on(ExitStatus.FAILED.getExitCode()).end()
           .from(checkFilesForProd)
           .on("*")
           .to(productionOutStep)
           .build();

您正在寻找的已经是 Spring 批处理的默认行为,即如果上一步失败则不会执行下一步。要将当前步骤标记为失败步骤,您需要抛出未捕获的 运行 时间异常。

如果不处理异常,spring批处理将把该步骤标记为失败并且不会执行下一步。因此,您需要做的就是对失败的场景抛出异常。

对于复杂的工作流程,您可能喜欢使用 - JobExecutionDecider , Programmatic Flow Decisions