繁体   English   中英

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

[英]Spring Batch : Skip a record that cannot be written to the database and proceed with the next record

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

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

go 如何在Spring 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时,都会跳过相应的项目。 您可以在参考文档的配置跳过逻辑部分找到更多详细信息。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM