Spring Batch:在项目写入​​期间跳过

时间:2011-07-18 06:23:41

标签: spring-batch

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

  

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

我的提交间隔设置为10.所以我对上面段落的理解是,如果他们在读取10块大小的第7条记录时出错,则会跳过该项目,并且将通过itemReader提前发送正确的9条记录。

但是,如果第7条记录在写入期间出错 - 将不会写入10条记录,并且会发生回滚。

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

任何人都可以解释“在项目写作过程中跳过”的概念。

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

SkipCount为-1​​两次,然后为0,并且在我的shouldSkip(Object,Throwable)方法中再次为-1。 - 我没有得到这种行为。

回滚次数也是2 - 这是什么意思?为什么是2?


@michael您是否有可能使用某种情况来解释行为!!

喜欢“我正在从一个文件中读取20条记录并在一些处理后写入数据库。我有一个跳过策略集用于某些异常。如果在读取,处理,写入期间发生异常将会发生什么 - 如何将提交块,默认重试如何工作,如何更新计数等等......“

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

2 个答案:

答案 0 :(得分:8)

从您的用例描述中可以看出,您混合了不同的概念。

您描述的是skip scenario,但您似乎希望跳过应该像no-rollback方案一样工作。

来自春季批处理文档的

skip

  处理时遇到的

错误不应导致步骤失败,   但应该跳过

vs no-rollback

  

如果如上所述配置了skip,则会抛出异常   ItemReader不会导致回滚。

用我自己的话来说,跳过意味着:

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

  

回滚次数也是2 - 这是什么意思?为什么是2?

来自B.5. BATCH_STEP_EXECUTION

  

ROLLBACK_COUNT:执行期间的回滚次数。注意   这个计数包括每次回滚发生时,   包括重试的回滚和跳过恢复过程中的回滚

(强调我的)

  

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

     

SkipCount为-1​​两次,然后为0,一次为-1,一次为-1   shouldSkip(Object,Throwable)方法。 - 我没有得到这个   行为。

我尝试了一个简单的跳过作业,包括配置样式,skip-policy和skip-limit with skippable-exception,两者在回滚和跳过计数方面的工作方式相同

(步骤元数据没问题,但是看起来像是跳过(...)似乎比预期的要多得多)

答案 1 :(得分:0)

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

  

SkipCount为-1​​两次,然后为0,并且在我的shouldSkip(Object,Throwable)方法中再次为-1。 - 我没有得到这种行为。

我不知道您引用的shouldSkip()方法的签名,但在我的SkipPolicy界面中,只有一种方法具有以下签名:

boolean shouldSkip(Throwable t, int skipCount) throws SkipLimitExceededException;

该方法应决定是否应跳过给定Exception e的{​​{1}}。

不幸的是,Spring Batch的程序员滥用这个方法来测试,无论当前的跳过次数是否可以跳过异常。这就是为什么在skipCount参数设置为skipCount的情况下有多次调用此方法的原因。

所以,不要对你所看到的行为感到好奇。