स्प्रिंग बैच में त्रुटि होने पर टास्कलेट कैसे छोड़ें?

Nov 23 2020

यदि मैं इस पर कोई त्रुटि रखता हूं और किसी 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;
    }

टास्कलेट StepExecutionListener को लागू करता है, लेकिन IF में कैसे इंगित किया जाता है जिसमें निष्पादन स्थिति को संशोधित करने में त्रुटि होती है ताकि यह FAILED में हो?

आपके नेतृत्व के लिए धन्यवाद।

जवाब

2 ChanduAllenki Nov 30 2020 at 23:05

उपरोक्त आवश्यकता के आधार पर, हम स्प्रिंग बैच FlowBuilder वस्तु का उपयोग करके एक प्रवाह का निर्माण कर सकते हैं ।

१। एक टास्कलेट का निर्माण करें जो आवश्यक सत्यापन करता है और सत्यापन परिणाम के आधार पर एक्ज़िटस्टैटस सेट करता है

    @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;
        }
    }

२। नीचे कोड स्निपेट प्रवाह बिल्डर का उपयोग करके नौकरी को कॉन्फ़िगर करने की अनुमति देता है:

    @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 उपरोक्त कोड से आशा है कि समस्या का समाधान होगा।