【问题标题】:SpringBatch: ChunkStep retried on exception in writer even with NeverRetryPolicySpring Batch:即使使用 Never RetryPolicy,Chunk Step 也会在 writer 中重试异常
【发布时间】:2020-08-28 13:47:56
【问题描述】:

我在 Spring Batch 中配置了一个 ChunkStep,如下所示:

stepBuilderFactory
    .get( "myStep" )
    .<I, O> chunk( 1 )
    .transactionManager( txManager )
    .faultTolerant()
    .skipPolicy( new AlwaysSkipItemSkipPolicy() )
    .retryPolicy( new NeverRetryPolicy() )
    .listener( stepSkipListener )
    .reader( someReader ).processor( someProc ).writer( someWriter );

通过另一个项目处理一个项目,并且在处理器或写入器发生异常的情况下仅记录它。

不幸的是,编写器抛出的第一个异常甚至没有发送到侦听器,而是重试了该项目(处理器和编写器)。

如何配置块步骤以跳过项目?

【问题讨论】:

    标签: spring-batch


    【解决方案1】:

    查看您的代码,我认为您的情况类似于:https://github.com/spring-projects/spring-batch/issues/2071。引用 this comment 的 Dave Syer 博士的话:

    跳过仍然是(并且可能永远是)用于重试的恢复选项

    我同意。因此,将“始终跳过”策略与“永不重试”策略一起使用实际上是不兼容的。

    从技术上讲,当块扫描被激活时(也就是当一个可跳过的异常被抛出时),每个项目在它自己的事务中被重新处理/重新写入(提交间隔在场景后面被(重新)设置为 1 并且该块被逐项重新处理)。换句话说,ChunkProcessor,更准确地说是您的情况下的FaultTolerantChunkProcessor(由ItemProcessor + ItemWriter 组成)被重新应用于块的每个项目。

    因此您可能认为您的项目已被重试(尽管使用了NeverRetryPolicy),但这实际上是块扫描过程的一部分(与跳过策略有关)。

    不幸的是,作者抛出的第一个异常甚至没有发送给监听器

    不应该是这样的。你可以在这里找到一个例子:https://stackoverflow.com/a/51985616/5019386。请注意,使用stepBuilderFactory 时方法调用的顺序可能很重要,因为这些方法返回不同类型的构建器,所以我邀请您尝试:

    stepBuilderFactory
        .get( "myStep" )
        .<I, O> chunk( 1 )
        .reader( someReader ).processor( someProc ).writer( someWriter )
        .faultTolerant()
        .skipPolicy( new AlwaysSkipItemSkipPolicy() )
        .listener( stepSkipListener );
    

    【讨论】:

      猜你喜欢
      • 2012-06-16
      • 2020-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多