春季批处理:跳过无法写入数据库的记录,然后继续下一条记录

时间:2019-11-08 05:28:16

标签: java spring exception spring-batch

给出一个 Spring Batch 作业,该作业使用面向块的处理从文件中读取数据,对数据进行一些处理,并将转换后的记录写入数据库,是否可以跳过记录如果在写入数据库时​​出现异常并继续下一条记录? (某种拦截器?)

据我所知,当无法写入给定块中的记录(例如,值大于数据库列的长度)时,整个块将失败。我想要的是将此记录传递给某个拦截器,然后可以通过更正该值或将错误记录写入某个日志文件来尝试解决问题,然后继续进行下一个记录,而不是使批处理失败。我知道Spring Batch提供了一些内置的侦听器,这些侦听器会在发生异常时触发,但是我无法弄清楚如何使用它们执行我想要的操作。

如何在 Spring Batch 中实现此要求?

1 个答案:

答案 0 :(得分:0)

  

是否有一种方法可以跳过记录,以防写入数据库时​​出现异常并继续下一条记录?

使用容错步骤,可以配置SkipPolicy。这是一个示例:

@Bean
public Step step1() {
   return this.stepBuilderFactory.get("step1")
            .<String, String>chunk(10)
            .reader(flatFileItemReader())
            .writer(itemWriter())
            .faultTolerant()
            .skipLimit(10)
            .skip(FlatFileParseException.class)
            .build();
}

在此示例中,每当FlatFileParseException发生时,相应的项目将被跳过。您可以在参考文档的Configuring Skip Logic部分中找到更多详细信息。

  

我想要的是将此记录传递给某些拦截器,然后可以通过更正值或将错误记录写入某些日志文件的方式来尝试解决此问题

您可以通过注册SkipListener来获得有关跳过项目的通知。例如,这是将跳过的项目记录到文件的正确位置。

  

并继续下一条记录,而不是使批处理失败

在写操作期间引发可跳过的异常时,Spring Batch将扫描块中有缺陷的项目(因为它不知道是哪个项目导致了错误)。从技术上讲,Spring Batch会将块大小设置为1,并且每个项目使用一个事务,因此只有有故障的项目才会回滚。这样可以实现上述要求。您可以找到代码示例here