Решение, которое я нашел, может быть не лучшим, но на данный момент я продолжаю с нижеприведенным.
@Bean
public Job fileParserJob() {
return jobBuilderFactory.get("fileParserJob")
.incrementer(new RunIdIncrementer())
.start(validateFileStep())
.next(validateFileStatusStep())
.build();
}
public Step validateFileStep() {
return stepBuilderFactory.get("validateFileStep")
.tasklet(fileTasklet)
.build();
}
public Step validateFileStatusStep() {
return stepBuilderFactory.get("validateFileStatusStep")
.tasklet(validateBatchFileDetailTasklet)
.build();
}
FileTasklet.java
-----------------
@Override
@Transactional(dontRollbackOn=BatchServiceException.class)
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
Resource resource = new FileSystemResource(filePath);
BatchFileDetail batchFileDetail = new BatchFileDetail();
batchFileDetail.setFileId(String.valueOf(System.currentTimeMillis()));
batchFileDetail.setFileName(resource.getFilename());
batchFileDetail.setStatus("STARTED");
batchFileDetail.setProcessedOn(new Date());
CommonUtillity.validateBatchResource(resource, StringConstants.FILE_NAME, batchFileDetail);
validateBatchFileDetail(resource.getFile(), batchFileDetail);
batchFileDetailRepository.saveAndFlush(batchFileDetail);
return RepeatStatus.FINISHED;
}
}
ValidateBatchFileDetailTasklet
------------------------------
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
BatchFileDetail batchFileDetail = batchFileDetailRepository.getRecentFailedTransactionStatus(StringConstants.FILE_NAME);
if(StringConstants.FAILED.equals(batchFileDetail.getStatus())) {
throw new BatchServiceException(batchFileDetail.getReason());
}
return RepeatStatus.FINISHED;
}
С этим решением обновляется первая таблица ошибок с указанием статуса ошибки и причины ошибки, затем транзакция фиксируется в один шаг. На следующем шаге выборка последней записи на основе имени файла и проверка статуса выбранной записи. Если это было FAILED
, выдается исключение для завершения текущего задания.
Если статус не только FAILED
, необходимо обработать следующие данные. Если статус был FAILED
, мы должны прекратить текущее пакетное задание.