我有以下步骤:
return stepBuilderFactory.get("billStep")
.allowStartIfComplete(true)
.chunk(20000)
.reader(billReader)
.processor(billProcessor)
.faultTolerant()
.skipLimit(Integer.MAX_VALUE)
.skip(BillSkipException.class)
.listener(billReaderListener)
.listener(billSkipListener)
.writer(billRepoItemWriter)
.build();
我的理解是否正确,容错意味着当 billProcessor 中抛出异常时,它将在跳过监听器中处理,然后下一行/项目将在 billProcessor 中处理?
我在添加调试日志时注意到 - 当处理器中抛出异常时,项目/行被“重新处理”。 (可能是因为容错配置。
但是,如果我正在处理 200 万条记录,并且其中的 300,000 条被跳过 - 或者抛出一个跳过异常 - 如果其中一些被“重新处理”,这不是性能问题吗?)
最大的问题是 - 下一行/项目被跳过。它们根本没有在处理器中处理。
如果我删除了 faultTolerant 和 SkipListener - 并直接将跳过的记录保存在数据库中(skiplistener 在做什么) - 它正在工作,但这个解决方案是否正确?
最佳答案
我发生了同样的问题,我使用 processorNonTransactional
方法修复了。
@Bean
public Step myStep() {
return stepBuilderFactory.get("myStep")
.<MyObject, MyObject>chunk(1000)
.reader(myItemReader())
.processor(myItemProcessor())
.writer(jdbcBatchItemWriter())
.faultTolerant()
.processorNonTransactional()
.skip(MyException.class)
.skipLimit(200)
.build();
}
关于 Spring 批次 : Fault Tolerant,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44255167/