如何使 Spring 批处理步骤取决于上一步?
How to make a Spring Batch step depends on previous step?
我正在使用 Spring Batch 从 CSV 文件中读取一些数据并将其放入数据库中。
我的批处理作业必须包含 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
我正在使用 Spring Batch 从 CSV 文件中读取一些数据并将其放入数据库中。 我的批处理作业必须包含 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