java - Spring Batch:跳过无法写入数据库的记录并继续下一条记录
问题描述
给定一个Spring Batch作业,它使用面向块的处理从文件中读取数据,对数据执行一些处理并将转换后的记录写入数据库,有没有办法跳过记录,以防在写入时出现异常数据库并继续下一条记录?(某种拦截器?)
另外,据我了解,当无法写入给定块中的记录时(例如,值大于数据库列的长度),整个块将失败。我想要的是将此记录传递给某个拦截器,然后该拦截器可以尝试通过更正值或将错误记录写入某个日志文件来解决问题并继续下一条记录,而不是使批处理失败。我知道 Spring Batch 提供了一些在异常时触发的内置侦听器,但我无法弄清楚如何使用它们来做我想做的事。
如何在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
发生 a 时,都会跳过相应的项目。您可以在参考文档的配置跳过逻辑部分找到更多详细信息。
我想要的是将此记录传递给某个拦截器,然后该拦截器可以尝试通过更正值或将错误记录写入某个日志文件来解决问题
您可以通过注册SkipListener获得有关跳过项目的通知。例如,这是将跳过的项目记录到文件的正确位置。
并继续下一条记录,而不是使批次失败
当在写操作过程中抛出可跳过的异常时,Spring Batch 会扫描块中的错误项(因为它无法知道是哪个项导致了错误)。从技术上讲,Spring Batch 会将块大小设置为 1,并且每个项目使用一个事务,因此只会回滚有问题的项目。这使您可以实现上述要求。您可以在此处找到代码示例。
推荐阅读
- radio-button - Gravityforms - 添加类别中间单选按钮字段
- binary - 如何使用 Nim 在特定地址位置编辑二进制文件?
- php - 在不重新加载页面的情况下运行 PHP API 调用
- javascript - 我怎样才能递归地重写这个函数?
- python-3.x - 我想在 jupyter notebook 上导入 pandas 和 numpy 并收到 [WinError 193] %1 is not a valid Win32 application?
- flutter - Flutter 长表单不保存所有 FormTextField 值
- react-native - React Native 如何将时间和日期设置为本地设备?
- json - Flutter POST 请求添加数据有一些问题
- tensorflow - WebGL 动画减慢了 TensorflowJS 模型推理的速度
- android - 将圆形图像转换为矩形