Как записать данные, которые вызывают исключение во время выполнения в Spring Batch Reader - PullRequest
0 голосов
/ 12 апреля 2019

Мне нужно захватить исключение времени выполнения в считывателе и пропустить их, поэтому я использую skipPolicy, чтобы сделать это, как показано ниже. Также есть требование записать, какие данные вызывают исключение времени выполнения. У меня есть некоторая логика преобразования в читателе, но ItemReadListener не имеет доступа к информации об элементе. Я не уверен, где / как получить доступ к такой информации.

Должен ли я переместить логику преобразования из считывателя в процессор, а затем реализовать ItemProcessListener для записи элемента ошибки? В этом случае следует ли обновить метод step1 ниже? Заранее спасибо!

@Bean
public Step step1() {
    return stepBuilderFactory.get("step1")
        .reader(reader1())
        .faultTolerant().skipPolicy(runtimeExceptionSkipper())
    .processor(processor1())
    .writer(writer1())
    .build();
}


@Bean(destroyMethod="")
public JdbcCursorItemReader<Job> reader1() {

    return new JdbcCursorItemReaderBuilder<Job>()
                    .dataSource(dataSourceConfig.dataSource())
                    .name("reader1")
                    .sql(Constants.QUERY_JOB_SQL)
                    .rowMapper(new JobRowMapper())
                    .build();

}

public class JobRowMapper implements RowMapper<Job> {


    public Job mapRow(ResultSet rs, int rowNum) throws SQLException {

        Job jobSchedule = new Job();
        String timeZone = rs.getString(Constants.COLUMN1);

        LocalDateTime localStart = 
        rs.getTimestamp(Constants.COLUMN2).toLocalDateTime();

        ZonedDateTime utcStart = ZonedDateTime.of(localStart, 
        ZoneId.of("GMT"));

        ZonedDateTime zonedStart = 
        utcStart.withZoneSameInstant(ZoneId.of(timeZone));

        job.setEffectDate(zonedStart.toLocalDate());

        return job;
    }
}

@Bean
public Step updatedStep1() {
    return stepBuilderFactory.get("updatedStep1")
        .reader(reader1())
    .processor(processor1())
        .faultTolerant().skipPolicy(runtimeExceptionSkipper())
        .listener(itemProcessListener())
    .writer(writer1())
    .build();
}

1 Ответ

1 голос
/ 12 апреля 2019

Лучшее, что вы можете здесь сделать - это получить информацию от Exception. Причина, по которой мы не предоставляем его через слушателя, заключается в том, что нет «элемента» для передачи. Учитывая, что каждый источник данных уникален, мы не можем предоставить общий способ предоставления данных. Однако в большинстве случаев мы делаем все возможное, чтобы предоставить как можно больше информации о том, что вызвало ошибку в Exception. Например, FlatFileParseException включает String, который мы пытались проанализировать, а также номер строки, где произошла ошибка. Если вы предоставите нам дополнительную информацию о конкретном ItemReader, который вы используете, мы сможем предоставить дальнейшие рекомендации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...