项目写入期间意外的回滚计数和对shouldSkip()的调用 [英] Unexpected rollbackCount and calls of shouldSkip() during item write
问题描述
我的提交间隔设置为10。因此,我对上面段落的理解是,如果他们在读取10个记录块中的第7条记录时出错,则该项将被跳过,而正确的9条记录将由itemReader提前发送。 但是,如果第7条记录在写入过程中出错-10条记录都不会写入,并且会发生回滚。 但是,当我在skipPolicy中包含抛出的错误时,itemWriter将剩余的9条记录写入数据库,跳过出错的那条记录。这与上面提到的相矛盾。默认情况下,无论重试还是跳过,ItemWriter抛出的任何异常都将导致步骤控制的事务回滚。如果如上所述配置了Skip,则ItemReader抛出的异常不会导致回滚。
谁能解释一下"撰写项目时跳过"的概念。
另外,即使抛出一个错误,我也得到以下信息:
SkipCount在我的shouldSkip(object,Throwable)方法中设置为-1两次,然后设置为0,并再次设置为-1。--我不明白这种行为。
此外,回滚计数为2--这是什么意思?为什么是%2?@Michael,您能不能用一些场景来解释一下这种行为!!
如"我正在从一个文件中读取20条记录,并在经过一些处理后写入数据库。我为某些异常设置了跳过策略。如果在读取、处理、写入过程中发生异常将会发生什么?如何提交区块、如何默认重试、如何更新计数等……"
这对我真的是一个很大的帮助,因为我仍然对这种行为感到困惑。
推荐答案
从您的用例说明看,您似乎混淆了不同的概念。
您描述的是skip scenario,但您似乎希望跳过应该像no-rollback方案一样工作。
来自Spring Batch文档
skip:
处理过程中遇到的错误不应导致步骤失败, 而应跳过
vsno-rollback:
如果如上所述配置了SKIP,则从 ItemReader不会导致回滚。
用我自己的话说,跳过的意思是:
如果该步骤在读/处理/写过程中遇到错误,将回滚当前块,并且单独读/处理/写块的每一项-没有坏项。基本上,对于坏块,Spring Batch会回落到提交速率1,并且在坏块之后会回落到指定的提交速率。
此外,回滚计数为2--这是什么意思?为什么是%2?
ROLLBACK_COUNT:本次执行期间的回滚次数。注意事项 此计数在每次发生回滚时都包括在内, 包括用于重试的回滚和跳过恢复过程中的回滚。
(强调我的)
另外,即使抛出一个错误,我也得到以下信息:
SkipCount As-1两次,然后是0,在我的 shouldSkip(Object,Throwable)方法。--我不明白 行为。
我尝试了一个具有两种配置样式的简单跳过作业,即跳过策略和带有可跳过异常的跳过限制,两者在回滚和跳过计数方面的工作方式相同
(步骤元数据可以,但应该跳过(.)似乎调用的次数比预期的多得多)
这篇关于项目写入期间意外的回滚计数和对shouldSkip()的调用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!