Jak zamknąć tasklet w przypadku błędu w Spring Batch?

Nov 23 2020

Chciałbym czysto zamknąć tasklet, jeśli mam na nim błąd i umieścić i zatrzymać partię bez konieczności uciekania się do System.exit (1).

Oto mój kod:

/**
     * 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 implementuje StepExecutionListener, ale jak wskazać w IF zawierającym błąd, aby zmodyfikować status wykonania, tak aby był w FAILED?

Dziękuję za wskazówki.

Odpowiedzi

2 ChanduAllenki Nov 30 2020 at 23:05

Opierając się na powyższym wymaganiu, możemy zbudować przepływ używając sprężynowego obiektu FlowBuilder .

1. Zbuduj Tasklet, który przeprowadza wymagane walidacje i ustawia ExitStatus na podstawie wyniku walidacji .

    @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. Poniższy fragment kodu umożliwia konfigurację zadania za pomocą kreatora przepływu:

    @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 Mam nadzieję, że powyższy kod rozwiąże opis problemu.