Мне нужно захватить исключение времени выполнения в считывателе и пропустить их, поэтому я использую 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();
}