1

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

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

Step 2如果Step 1生成错误,则不得执行(文件不符合,文件不存在......)

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

@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();
    }
}
4

2 回答 2

3

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

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

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

于 2017-08-30T03:38:15.717 回答
1

正如文档所指定的,如果前一个状态的退出状态与给定模式匹配,您可以使用“on”方法开始转换到新状态。

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

    return jobBuilderFactory.get("productionOutJob")
           .start(checkFilesForProd)
           .on(ExitStatus.FAILED.getExitCode()).end()
           .from(checkFilesForProd)
           .on("*")
           .to(productionOutStep)
           .build();
于 2017-08-29T09:23:37.810 回答