Spring batch 项目写入期间意外的回滚计数和shouldSkip()调用

Spring batch 项目写入期间意外的回滚计数和shouldSkip()调用,spring-batch,Spring Batch,Spring文档(第46页,第5.1.7节)说明: 默认情况下,无论重试还是跳过,ItemWriter引发的任何异常都将导致该步骤控制的事务回滚。如果如上所述配置skip,则ItemReader引发的异常不会导致回滚 我的提交间隔设置为10。因此,我对上述段落的理解是,如果他们在读取10个记录块中的第7个记录时出错,则该项将被跳过,并且itemReader将提前发送正确的9个记录 但是,如果第7条记录在写入过程中出错,那么10条记录都不会被写入,并且会发生回滚 但是,当我将抛出的错误包括在Ski

Spring文档(第46页,第5.1.7节)说明:

默认情况下,无论重试还是跳过,ItemWriter引发的任何异常都将导致该步骤控制的事务回滚。如果如上所述配置skip,则ItemReader引发的异常不会导致回滚

我的提交间隔设置为10。因此,我对上述段落的理解是,如果他们在读取10个记录块中的第7个记录时出错,则该项将被跳过,并且itemReader将提前发送正确的9个记录

但是,如果第7条记录在写入过程中出错,那么10条记录都不会被写入,并且会发生回滚

但是,当我将抛出的错误包括在SkippPolicy中时,itemWriter正在将剩余的9条记录写入数据库,从而跳过出错的记录。这与上面提到的是矛盾的

请任何人解释一下“写作时跳过”的概念

即使抛出一个错误,我也会得到以下结果:

在我的shouldSkip(Object,Throwable)方法中,SkipCount为-1两次,然后为0一次,再为-1一次我没有这种行为

回滚计数也是2——这是什么意思?为什么是2


@michael,你能用一些场景来解释这种行为吗

比如“我正在从一个文件中读取20条记录,并在经过一些处理后写入数据库。我为某些异常设置了跳过策略。如果在读取、处理、写入过程中发生异常,会发生什么情况--如何提交数据块,默认重试如何工作,计数如何更新,等等…”


这对我来说真的是一个很大的帮助,因为我仍然对行为感到困惑。

从您的用例描述来看,您似乎混合了不同的概念

您描述了一个场景,但似乎希望skip可以像场景一样工作

来自spring批处理文档

:

处理过程中遇到的错误不应导致步骤失败, 但是应该跳过

vs:

如果如上所述配置skip,则会从 ItemReader不会导致回滚

用我自己的话来说,skip的意思是:

如果该步骤在读取/处理/写入期间遇到错误,则当前区块将回滚,并且区块中的每个项目都将被单独读取/处理/写入,而没有坏项目。基本上,Spring批处理返回到坏块的提交速率1,并在坏块之后返回到指定的提交速率

回滚计数也是2——这是什么意思?为什么是2

ROLLBACK\u COUNT:此执行期间的回滚次数。注 此计数包括每次发生回滚时, 包括重试回滚和跳过恢复过程中的回滚

(强调我的)

即使抛出一个错误,我也会得到以下结果:

SkipCount为-1两次,然后为0一次,在我的 shouldSkip(对象,可丢弃)方法。-我不明白 行为

我尝试了一个带有两种配置样式的简单跳过作业,跳过策略和带有可跳过异常的跳过限制,两者在回滚和跳过计数方面的工作方式相同


(步骤元数据是正确的,但shouldSkip(…)的名称似乎比预期的要多)

我想解释一下您提到的一个问题:

在我的shouldSkip(Object,Throwable)方法中,SkipCount为-1两次,然后为0一次,再为-1一次我没有这种行为

我不知道您引用的
方法的哪个签名应该是skip()
方法,但在我的
SkipPolicy
界面中,只有一个方法具有以下签名:

boolean shouldSkip(Throwable t, int skipCount) throws SkipLimitExceededException;
此方法决定是否应跳过给定
skipCount
异常e

不幸的是,Spring Batch的程序员误用了这个方法来测试异常是否可以跳过,而不管当前的跳过计数是多少。这就是为什么在
skipCount
参数设置为
-1
时会多次调用此方法的原因


所以,不要对你看到的行为感到惊讶。

这是一个很大的要求,我建议你创建一个简单的项目,自己测试它