在我的特定场景中,我必须将从文件读取的大量实体持久保存到数据库中,但我的提交间隔配置为value = 1
. 另外我不太确定使用中的委托处理器CompositeItemProcessor
是否是幂等的。所以我的问题是,是否有办法防止浪费时间重新处理并避免对数据库进行许多未使用的查询。我还想使用 SkipListener 将读取/处理/写入中的错误记录到特定表中,并怀疑此类配置(无重新处理)不符合此要求。
我正在使用春季批次 2.1.9。
提前致谢。
____________________________更新 07-05-2016 ____________________________
经过几天的研究,我意识到一些用户和 Spring 开发人员之间存在概念上的争论。
我现在知道,正如@MichaelMinella 在2014 年这篇帖子的答案评论中所说,这种行为是在写作阶段抛出的跳过异常上设计的:
该
ItemWriter#write
方法接收项目列表。如果不一次遍历它们,我们就无法确定列表中的哪个在编写器中引发了异常。
因此,框架还没有办法在不扫描整个列表的情况下发现失败的项目(即使块大小为1)。执行此操作的框架的内部行为在此 2013 帖子FaultTolerantChunkProcessor
中进行了RetryTemplate
描述,有关此问题的更多讨论可在此Spring Batch Forum 2012 帖子中找到。