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



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

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

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

仅供参考,我正在使用没有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();
}
}

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

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

对于复杂的作业流,您可能希望使用 - JobExecutionDecider , 编程流决策

正如文档指定的那样,您可以使用方法"on",如果先前状态的退出状态与给定模式匹配,则该方法将开始过渡到新状态。

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

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

最新更新