java - Spring Batch 跳过异常未按预期工作
问题描述
我有一个由一个步骤组成的春季批处理作业,即下面的步骤。它读取 100 个 json 文件进行处理,并将它们以 25 个块的形式保存到数据库中。由于块中的不同插入语句可能导致 ConstraintViolationException,这可以通过一个一个处理来轻松解决。这就是为什么我考虑使用'faultTolerant'和skipLimit(也尝试过重试),希望当25个项目的块失败时,它会一个一个地重试它们以找到有故障的一个并提交其他24个DetailApplications。然而,这种情况并非如此。它只是跳过了 25 个 DetailApplications 的整个块。最终统计数据是 3 次提交、100 次读取、75 次写入和 1 次回滚。我在这里做错了什么?或者我忘记了什么?
步:
return stepBuilderFactory.get("stepImportDetailsJob")
.<DataJson, DetailApplication> chunk(25)
.reader(detailApplicationReader)
.processor(detailApplicationProcessor)
.writer(detailApplicationWriter)
.faultTolerant()
.skipLimit(5)
.skip(Exception.class)
.build();
写法:
@Override
public void write(List<? extends DetailApplication> list) {
detailApplicationRepository.saveAll(list);
}
该列表总是带有大小 25(块大小),而我希望在“定位”问题时这是 1。
解决方案
我能够使用这个答案使其工作。为了解决这个问题,我所要做的就是在保存后刷新 entityManager。我的 write 方法现在看起来像这样:
@Override
public void write(List<? extends DetailApplication> list) {
detailApplicationRepository.saveAll(list);
entityManager.flush();
}
推荐阅读
- macos - 如何对 Install4j 创建的 .dmg 中捆绑的 Java 应用程序进行公证?
- java - 屏幕锁定时,三星设备上的 BLE 扫描停止
- angular - 如何处理 RxJS 中相互传递数据的子顺序 URL 调用?
- docker - 复制失败:stat /var/lib/docker/tmp/docker-builder076499369/files/nginx.conf:没有这样的文件或目录
- java - 如何编写发送电子邮件或传真的接口
- ios - 将 UIImage 转换为 Base64 时,不包含/删除 exif 信息
- laravel - 如何在 Laravel 上使用碳将日期格式从 dd/mm/yyyy 转换为 yyyy-mm-dd
- java - 即使有 Internet 权限,FTPClient 也无法解析主机
- angular - 角度材料数据表排序不起作用/未显示箭头
- android - 在 ExoPlayer 中使用 ConcatenatingMediaSource 时 seekTo(mTimeMilis) 无法正常工作