Как применить 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;
    }

Надеюсь, вы можете мне помочь. Благодарю вас!

0 ответов

Другие вопросы по тегам