Как пропустить выполнение шага в StepExeuctionListener на основе некоторого условия в пакете Spring - PullRequest
0 голосов
/ 22 сентября 2019

Код для настройки задания public Job jobForFile() { return jobBuilderFactory.get("jobForFile") .incrementer(new RunIdIncrementer()) .listener(jobCompletionListener) .flow(getStep()).on(CONTINUE.name()).to(getStep()).on(COMPLETED.name()).end() .end() .build(); }

Code for configuring step
` 
 @Override
    public Step createStepForFile() {
        return stepBuilderFactory.get("stepForFileUpload")
                .<TransactionInfo, Future<Object>>chunk(applicationProperties.getChunkSize())
                .reader(transactionInfosReader())
                .processor(asyncItemProcessor())
                .writer(asyncItemWriter())
                .allowStartIfComplete(true)
                .listener(repeatExecution())
                .listener(processNextMerchant())
                .build();
    }
`
Code for configuring StepExecutionListener
` @Override
    public void beforeStep(StepExecution stepExecution) {
        JobExecution jobExecution = stepExecution.getJobExecution();
        JobParameters jobParameters = jobExecution.getJobParameters();
        ExecutionContext executionContext = jobExecution.getExecutionContext();
        Long totalPageCount = (Long) executionContext.get(TOTAL_PAGE_COUNT.value());
        AcquirerInfo acquirerInfo = (AcquirerInfo) jobParameters.getParameters().get(ACQUIRER_INFO.value()).getValue();
        if (Objects.isNull(totalPageCount)) {
            if (!acquirerInfo.getMerchantList().isEmpty()) {
                MerchantInfo merchantInfo = acquirerInfo.getMerchantList().get(0);
                log.info("Settlement started for MerchantId/InstitutionId {}",merchantInfo.getMerchantId());
                executionContext.put(MERCHANT_ACCOUNT.value(), merchantInfo);
            }
        } else if (totalPageCount == 1 && Objects.nonNull(acquirerInfo.getMerchantList())) {
            MerchantInfo merchantInfo = acquirerInfo.getMerchantList().get(0);
            executionContext.put(MERCHANT_ACCOUNT.value(), merchantInfo);
        } else
            stepExecution.setExitStatus(new ExitStatus(COMPLETED.name()));
    }`
`
    @Override
    public ExitStatus afterStep(StepExecution stepExecution) {
        JobExecution jobExecution = stepExecution.getJobExecution();
        JobParameters jobParameters = jobExecution.getJobParameters();
        AcquirerInfo acquirerInfo = (AcquirerInfo) jobParameters.getParameters().get(ACQUIRER_INFO.value()).getValue();
        if (stepExecution.getExitStatus().getExitCode().contentEquals(IN_PROGRESS.name())) {
            stepExecution.setExitStatus(new ExitStatus(CONTINUE.name()));
        } else {
            if (!acquirerInfo.getMerchantList().isEmpty()) {
                acquirerInfo.getMerchantList().remove(acquirerInfo.getMerchantList().get(0));
                jobParameters.getParameters().put(ACQUIRER_INFO.value(), new CustomJobParameter<>(acquirerInfo));
                stepExecution.setExitStatus(new ExitStatus(CONTINUE.name()));
            } else {
                stepExecution.setExitStatus(new ExitStatus(COMPLETED.name()));
            }
        }
        if (acquirerInfo.getMerchantList().isEmpty()) {
            stepExecution.setExitStatus(new ExitStatus(COMPLETED.name()));
            log.info("Transaction file has been successfully created for Acquirer: {}",acquirerInfo.getAcquirerId());
        }
        return stepExecution.getExitStatus();
    }`

У меня есть требование, где у меня есть Список сущностей.Каждый субъект может иметь или не иметь записи в базе данных.Прямо сейчас я передаю этот список в JobParameters.Я выбираю этот список в StepExecutionListener beforeStep (), и если список не пустой, я выбираю один объект и передаю его моему шагу, где записи выбираются в ItemReader, обрабатываются в ItemProcessor и, наконец, записываются в файл в ItemWriter.В StepExecutionListener afterStep () я удаляю этот объект и обновляю список и устанавливаю ExitStatus как CONTINUE, если больше объектов доступно в List, а параметр FINISHED - как ExitStatus.Все работает хорошо, пока здесь.Тот же шаг будет повторен для следующего объекта, если он существует.

Проблема в том, что внутри Reader, Processor и Writer задействовано много логики обработки.Итак, если нет записей, выполняется весь шаг, который я не хочу.Я попытался получить количество записей в самом StepExecutionListener, и на основании количества я попытался установить ExitStatus как FINISHED или CONTINUE, но все еще выполняется шаг.

Есть ли способ пропустить выполнение шага, если нетзапись для конкретного лица.Я получил предложение, что я должен сделать еще один шаг, который проверит количество записей, а затем я могу установить ExitStatus оттуда, и для этого я могу проверить это с JobExecutionDecider.Но проблема в том, что у меня есть только запрос RecordCount, который должен быть выполнен, тогда реализация шага здесь оптимизирована или нет.

Могу ли я использовать тасклет здесь вместо шага?Если да, то как я могу сконфигурировать мое задание, чтобы оно сначала выполняло тасклет, а затем на основе количества записей (если больше 0) этот шаг должен быть выполнен, иначе тасклет должен быть выполнен снова для следующего объекта в списке.

...