项目写入期间意外的回滚计数和对shouldSkip()的调用 [英] Unexpected rollbackCount and calls of shouldSkip() during item write

查看:13
本文介绍了项目写入期间意外的回滚计数和对shouldSkip()的调用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

Spring文档(PG.46节:5.1.7)表示:

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

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

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

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

谁能解释一下"撰写项目时跳过"的概念。

另外,即使抛出一个错误,我也得到以下信息:

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?

发件人B.5. BATCH_STEP_EXECUTION

ROLLBACK_COUNT:本次执行期间的回滚次数。注意事项 此计数在每次发生回滚时都包括在内, 包括用于重试的回滚和跳过恢复过程中的回滚

(强调我的)

另外,即使抛出一个错误,我也得到以下信息:

SkipCount As-1两次,然后是0,在我的 shouldSkip(Object,Throwable)方法。--我不明白 行为。

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

(步骤元数据可以,但应该跳过(.)似乎调用的次数比预期的多得多)

这篇关于项目写入期间意外的回滚计数和对shouldSkip()的调用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆