Код для настройки задания
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) этот шаг должен быть выполнен, иначе тасклет должен быть выполнен снова для следующего объекта в списке.