如果Spring Batch中出现错误,如何退出tasklet?

las*_*o37 5 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;
    }
Run Code Online (Sandbox Code Playgroud)

Tasklet 实现了 StepExecutionListener,但是如何在包含错误的 IF 中指示修改执行状态,使其处于 FAILED 状态?

感谢您的线索。

小智 4

基于以上需求,我们可以使用 Spring Batch FlowBuilder对象构建一个流程。

1. 构建一个执行所需验证并根据验证结果设置 ExitStatus 的 Tasklet

    @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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

    }
Run Code Online (Sandbox Code Playgroud)

@lasnico37希望上面的代码能够解决问题陈述。