首页 > 解决方案 > Spring Batch:跳过无法写入数据库的记录并继续下一条记录

问题描述

给定一个Spring Batch作业,它使用面向块的处理从文件中读取数据,对数据执行一些处理并将转换后的记录写入数据库,有没有办法跳过记录,以防在写入时出现异常数据库并继续下一条记录?(某种拦截器?)

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

如何在Spring Batch中实现这一要求?

标签: javaspringexceptionspring-batch

解决方案


有没有办法跳过一条记录,以防在写入数据库时​​出现异常并继续下一条记录?

使用容错步骤,您可以配置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发生 a 时,都会跳过相应的项目。您可以在参考文档的配置跳过逻辑部分找到更多详细信息。

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

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

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

当在写操作过程中抛出可跳过的异常时,Spring Batch 会扫描块中的错误项(因为它无法知道是哪个项导致了错误)。从技术上讲,Spring Batch 会将块大小设置为 1,并且每个项目使用一个事务,因此只会回滚有问题的项目。这使您可以实现上述要求。您可以在此处找到代码示例。


推荐阅读