Как применить Spring Batch RetryTemplate к Step / ItemWriter на основе фрагментов?
Я работаю над пакетной программой Spring, которая должна читать файл CSV, обрабатывать его, а затем отправлять его, вставляя его содержимое в базу данных. Задания запускаются через rest-Joblauncher (в случае, если это помогает).
Он работает большую часть времени, но соединение SQL иногда отправляет неизвестное "CannotCreateTransactionException" ( см. Этот пост). В качестве обходного пути я хочу, чтобы BatchWriter повторил процесс записи по крайней мере три раза, прежде чем он, наконец, отправит электронное письмо.
Конфигурация моего шага:
@Bean
public Step stepTwo() {
StepBuilder stepBuilder = stepBuilderFactory.get("Datenimport: " + currentJobName);
SimpleStepBuilder<TransferLsAuftrag, TransferLsAuftrag> chunk = stepBuilder
.<TransferLsAuftrag, TransferLsAuftrag>chunk(1337);
chunk.reader(reader());
chunk.processor(processor());
chunk.writer(writer());
return chunk.build();
}
реализация писателя:
public ItemWriter<TransferLsAuftrag> writer() {
final JdbcBatchItemWriter<TransferLsAuftrag> writer = new JdbcBatchItemWriter<TransferLsAuftrag>();
writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<TransferLsAuftrag>());
writer.setSql(
"<long sql insert Statement>");
writer.setDataSource(dataSource);
return writer;
}
мой пользовательский слушатель, который отправляет (раздражающие) электронные письма, когда задание не выполняется:
@Override
public void afterJob(JobExecution jobExecution) {
String jobName = jobExecution.getJobInstance().getJobName();
switch (jobExecution.getStatus()) {
case COMPLETED:
LOG.info(jobName + " ERFOLGREICH BEENDET");
successfullJobs += 1;
break;
case STOPPED:
// LOG.info(jobName + " wurde gestoppt");
stoppedJobs.add(jobExecution.toString());
break;
case FAILED:
failedJobs.add(jobExecution.getJobInstance().getJobName());
Email.sendEmail("Information: " + jobName + " ist fehlgeschlagen !", jobExecution.toString());
break;
default:
Email.sendEmail("Information: " + jobName + " ist fehlgeschlagen !", jobExecution.toString());
break;
}
Надеюсь, вы можете мне помочь. Благодарю вас!