spring-batch - 如果 Spring Batch 出错,如何退出 tasklet?
问题描述
如果我有一个错误,我想干净地退出一个 tasklet 并放置和停止批处理,而不必求助于 System.exit(1)。
这是我的代码:
/**
* execution de la tasklet
*
*/
@Override
public RepeatStatus execute(StepContribution arg0, ChunkContext arg1) throws IOException {
if (suiviFluxDao.getNbFileDateTrt(FilenameUtils.getName(resource), Utils.getDateFromStringFormatUS(dateTraitement)) > 0) {
LOGGER.info(PropertiesUtils.getLibelleExcep(Constantes.ERREUR_NB_FILE_SELECT,
new String[]{ConstantesNomsSql.TABLE_STCO_STAU_SUIVI_FLUX, FilenameUtils.getName(resource), dateTraitement, Constantes.NAME_TRT}));
System.exit(1);
} else {
SuiviFluxBO suiviFluxBO = new SuiviFluxBO();
suiviFluxBO.setDateSysteme(Utils.getDateTodayFormatUS());
suiviFluxBO.setDateTrt(Utils.getDateFromStringFormatUS(dateTraitement));
suiviFluxBO.setLibelleTrt("Batch_Java");
suiviFluxBO.setNomficTrt(FilenameUtils.getName(resource));
suiviFluxBO.setNbrrecTrt(Utils.countNbFile(resource));
suiviFluxBO.setNomtabTrt(ConstantesNomsSql.TABLE_STCO_STAU_FIC_ADH);
suiviFluxBO.setNbrlignesTrt(0);
suiviFluxDao.insertSuiviBO(suiviFluxBO);
}
// fin de l'execution
return RepeatStatus.FINISHED;
}
tasklet实现了StepExecutionListener,但是如何在包含错误的IF中指示修改执行状态使其处于FAILED?
谢谢你的线索。
解决方案
基于上述要求,我们可以使用 spring batch FlowBuilder对象构建一个流。
1. 构建一个 Tasklet,它执行所需的验证并根据验证结果设置 ExitStatus。
@Component
public class TestTasklet implements StepExecutionListener, Tasklet {
// Any additional properties if required can be added here .
@Override
public void beforeStep(StepExecution stepExecution) {
// Any logic added here will execute before executing step
}
@Override
public ExitStatus afterStep(StepExecution stepExecution) {
// Any logic added here will execute after executing step
return null;
}
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws IOException {
if (suiviFluxDao.getNbFileDateTrt(FilenameUtils.getName(resource),
Utils.getDateFromStringFormatUS(dateTraitement)) > 0) {
LOGGER.info(PropertiesUtils.getLibelleExcep(Constantes.ERREUR_NB_FILE_SELECT,
new String[]{ConstantesNomsSql.TABLE_STCO_STAU_SUIVI_FLUX, FilenameUtils.getName(resource),
dateTraitement, Constantes.NAME_TRT}));
contribution.setExitStatus(ExitStatus.FAILED);
} else {
// any logic goes here .
contribution.setExitStatus(ExitStatus.COMPLETED);
}
return RepeatStatus.FINISHED;
}
}
2. 下面的代码片段允许使用 flow builder 配置作业:
@Configuration
public class JobConfigurations {
private StepBuilderFactory stepBuilderFactory;
private JobBuilderFactory jobBuilderFactory;
@Autowired
public JobConfigurations(StepBuilderFactory stepBuilderFactory,
JobBuilderFactory jobBuilderFactory) {
this.stepBuilderFactory = stepBuilderFactory;
this.jobBuilderFactory = jobBuilderFactory;
}
@Bean
public Job job(TestTasklet testTasklet) {
Step validationStep = stepBuilderFactory.get("validationTasklet")
.tasklet(testTasklet).build();
//create another step where you want to perform business logic
//for sake of brevity let us assume it to be businessValidationStep
//Step businessValidationStep = stepBuilderFactory.get("businessvalidationstep")
// .chunk().reader().processor().writer();
return jobBuilderFactory.get("JOB_NAME").incrementer(new RunIdIncrementer())
.start(validationStep)// start your job with validation step
.on(ExitStatus.FAILED.getExitCode()).end()// this will terminate your job cleanly
.from(validationStep)
.on(ExitStatus.COMPLETED.getExitCode())//.to("businessValidationStep")
.to(validationStep).build().build();
}
}
@lasnico37 希望上面的代码能解决问题。
推荐阅读
- java - 保存使用 onTouchEvent 绘制到位图上的图像
- c# - 如何为 .Net Core Web 应用程序进行单元测试依赖关系解析?
- jquery - 如何在页面中嵌入 div,或如何剥离所有其他 div
- javascript - 推断参数的类型以避免泛型?
- python - 编写斐波那契函数
- java - 为什么我无法添加到链表的末尾?
- python - unicode vs 字符:什么是'\x10'
- android - 如何在 Android Studio 的 ConstraintLayout 中设置垂直控件的高度?
- r - 如何将直方图和密度图与 Y 轴上的数字而不是密度重叠
- node.js - 如何修复我的部署配置以显示一些代码?