如何在Spring Batch Reader中记录导致运行时异常的数据

时间:2019-04-12 03:16:27

标签: spring-batch

我需要在阅读器中捕获运行时异常并跳过它们,因此我使用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 个答案:

答案 0 :(得分:1)

您在这里能做的最好的事情就是从Exception获取信息。我们没有通过侦听器提供它的原因是没有“项目”可以传递。鉴于每个数据源都是唯一的,因此我们无法提供一种通用的方式来提供该数据是什么。但是,在大多数情况下,我们会尽力提供有关Exception中导致错误的原因的信息。例如,FlatFileParseException确实包含我们尝试解析的String以及发生错误的行号。如果您向我们提供了有关您所使用的特定ItemReader的更多信息,我们也许可以提供进一步的指导。