Spring batch 如何在spring批处理读取器中记录导致运行时异常的数据

Spring batch 如何在spring批处理读取器中记录导致运行时异常的数据,spring-batch,Spring Batch,我需要在reader中捕获运行时异常并跳过它们,所以我使用skipPolicy来实现这一点,如下所示。此外,还需要记录导致运行时异常的数据。我在reader中有一些转换逻辑,但ItemReadListener没有访问项信息的权限。我不确定在哪里/如何访问此类数据信息 我是否应该将转换逻辑从读取器移动到处理器,然后实现ItemProcessListener来记录错误项?在这种情况下,是否应使用以下步骤1方法?提前谢谢 @Bean public Step step1() { return s

我需要在reader中捕获运行时异常并跳过它们,所以我使用skipPolicy来实现这一点,如下所示。此外,还需要记录导致运行时异常的数据。我在reader中有一些转换逻辑,但ItemReadListener没有访问项信息的权限。我不确定在哪里/如何访问此类数据信息

我是否应该将转换逻辑从读取器移动到处理器,然后实现ItemProcessListener来记录错误项?在这种情况下,是否应使用以下步骤1方法?提前谢谢

@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();
}
@Bean
公共步骤第1步(){
返回stepBuilderFactory.get(“step1”)
.reader(reader1())
.faultTolerant().skipPolicy(runtimeExceptionSkipper())
.processor(processor1())
.writer(writer1())
.build();
}
@Bean(方法=”)
公共JdbcCursorItemReader reader1(){
返回新的JdbcCursorItemReaderBuilder()
.dataSource(dataSourceConfig.dataSource())
.名称(“读取器1”)
.sql(常量.QUERY\u作业\u sql)
.rowMapper(新作业rowMapper())
.build();
}
公共类JobRowMapper实现了RowMapper{
公共作业映射行(ResultSet rs,int rowNum)引发SQLException{
作业计划=新作业();
String timeZone=rs.getString(Constants.COLUMN1);
LocalDateTime localStart=
rs.getTimestamp(Constants.COLUMN2).toLocalDateTime();
ZonedDateTime utcStart=ZonedDateTime.of(localStart,
格林尼治标准时间(GMT);
ZonedDateTime zonedStart=
utcStart.与ZoneSameinstant(时区的ZoneId.);
job.setEffectDate(zonedStart.toLocalDate());
返回工作;
}
}
@豆子
公共步骤updatedStep1(){
返回stepBuilderFactory.get(“updatedStep1”)
.reader(reader1())
.processor(processor1())
.faultTolerant().skipPolicy(runtimeExceptionSkipper())
.listener(itemProcessListener())
.writer(writer1())
.build();
}

在这里,您最好从
异常中获取信息。我们不通过侦听器提供它的原因是没有要传递的“项”。鉴于每个数据源都是唯一的,我们无法提供一种通用的方法来提供该数据是什么。但是,在大多数情况下,我们会尽最大努力提供有关
异常中错误原因的尽可能多的信息。例如,
FlatFileParseException
确实包括我们试图解析的
字符串
,以及发生错误的行号。如果您向我们提供有关您正在使用的特定
ItemReader
的更多信息,我们可能会提供进一步的指导。

感谢您的回复。我在上面的代码中添加了JdbcCursorItemReader。运行时异常发生在rowmapper类中,在该类中,由于数据错误而对时区进行了分析。在这种情况下,如何记录不良数据@迈克尔