首页 文章

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

提问于
浏览
3

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

    从你的用例描述来看,你混合了不同的概念 .

    你描述了skip scenario,但你似乎期望跳过应该像no-rollback场景一样工作 .

    from the spring batch documentation

    skip

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

    vs no-rollback

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

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

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

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

    来自B.5. BATCH_STEP_EXECUTION

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

    (强调我的)

    即使抛出单个错误,我得到以下内容:SkipCount为-1两次,然后为0,并且在我的shouldSkip(Object,Throwable)方法中再次为-1 . - 我没有得到这种行为 .

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

    (步骤元数据是好的,但是应该跳过(...)似乎比预期的要多得多)

  • 8

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

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

    我不知道您引用的 shouldSkip() 方法的哪个签名,但在我的 SkipPolicy 接口中,只有一个方法具有以下签名:

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

    该方法应决定是否应跳过给定 skipCountException e .

    不幸的是,Spring Batch的程序员滥用了这个方法 to test, whether an exception is skippable in general regardless of the current skip count . 这就是为什么在 skipCount 参数设置为 -1 的情况下对此方法进行了多次调用 .

    所以,不要怀疑你所看到的行为 .

相关问题