Spring 文档(第 46 页,第 5.1.7 节)说:
默认情况下,无论是重试还是跳过,ItemWriter 抛出的任何异常都会导致 Step 控制的事务回滚。如果如上所述配置了跳过,则从 ItemReader 抛出的异常将不会导致回滚。
我的提交间隔设置为 10。所以我对上述段落的理解是,如果他们在读取 10 块中的第 7 条记录时出错,则该项目将被跳过,并且 itemReader 将提前发送正确的 9 条记录。
但是,如果在写入过程中第 7 条记录出错 - 这 10 条记录都不会被写入,并且会发生回滚。
但是,当我包含在我的 skipPolicy 中引发的错误时,itemWriter 正在将剩余的 9 条记录写入数据库,从而跳过错误的一条。这与上面提到的矛盾。
任何人都可以解释“在项目写作期间跳过”的概念。
此外,即使抛出单个错误,我也会得到以下信息:
在我的 shouldSkip(Object, Throwable) 方法中,SkipCount 两次为 -1,然后为 0,再次为 -1。- 我没有得到这种行为。
回滚计数也是 2 - 这是什么意思?为什么是 2 ?
@michael 您是否可以使用某些场景来解释行为!
就像“我正在从文件中读取 20 条记录并在经过一些处理后写入数据库。我为某些异常设置了跳过策略。如果异常发生在读取、处理、写入期间会发生什么——块将如何已提交,默认重试如何工作,计数将如何更新等等......”
这对我来说真的是一个很大的帮助,因为我仍然对这种行为感到困惑..