spring-batch - 如果 Spring Batch 出错,如何退出 tasklet?

标签 spring-batch

如果我有一个错误,我想干净地退出一个 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 批处理 构建一个流。 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 . 下面的代码片段允许使用流构建器配置作业:
    @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 希望上面的代码可以解决问题陈述。

关于spring-batch - 如果 Spring Batch 出错,如何退出 tasklet?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64968741/

相关文章:

多个作业的 Spring Batch JUnit 测试

java - 我想将步骤 1 中的数据传递给步骤 2 的读取器

java - 没有为SQL参数'orgName'提供值:此SqlParameterSource为空

java - 使用 Spring Batch 读取复杂的 json 文件

java - 基于Job参数配置Spring Batch Writer

spring-boot - Spring Boot 2.5.3 中使用 Spring Batch 和 Flyway 进行数据库初始化的问题

java - OptimisticLockingFailureException : Attempt to update step execution id=1 with wrong version (1),,其中 Spring Batch 代码中的当前版本为 2

java - 从 Oracle 中删除 1.9 亿条记录

java - Spring Batch 一次处理多个项目

java - 使用 Spring Batch 将文件中的日期解析为 LocalDateTime