在我的特定场景中,我必须将从文件读取的大型实体持久保存到数据库,但我的commit-interval配置为value = 1
。另外,我不太确定使用的CompositeItemProcessor
中的委托处理器是否是幂等的。所以我的问题是,是否有办法防止浪费时间重新处理并避免许多未使用的查询到数据库。我还想使用SkipListener将读取/处理/写入中的错误记录到特定的表中,并怀疑这样的配置(没有重新处理)不符合。
我正在使用春季批次2.1.9。
提前致谢。
____________________________ 更新07-05-2016 ____________________________
经过几天的研究,我意识到一些用户和春季开发者之间存在概念上的争论。
我现在知道这个行为是按照@MichaelMinella在此2014 post的答案评论中所述的在写作阶段抛出的跳过异常而设计的:
ItemWriter#write
方法接收项目列表。没有去 通过它们一次一个,我们无法确定哪个 在列表中抛出了作者中的异常。
因此,如果不扫描整个列表(即使块大小为 1 ),框架仍然无法发现失败的项目。执行此操作的框架的内部行为使用FaultTolerantChunkProcessor
,this 2013 post中描述了RetryTemplate
,可以在此spring batch forum 2012 post上找到关于此事的更多讨论。
答案 0 :(得分:0)
如果您的块大小等于1,则不应多次处理该项目。当发生跳过时,spring批量删除块中的跳过项并重新处理它。当块只包含一个元素时,应该没有多次处理元素。