在 spring 个批处理异步处理器中重试

retry in spring batch asyncprocessor

我们正在构建一个 spring 批处理,它在 spring 批处理

的处理器部分调用第三方 API

要求是当第 3 方 API 不可用时 spring 批处理需要重试指定的阈值限制并中止批处理

我已经尝试 spring 使用容错步骤进行批处理重试,它在单线程程序中工作正常,但是当我们包含 aysncprocessor 和 aysncitemwriter 时,它不会停止批处理

https://github.com/mminella/LearningSpringBatch/blob/master/src/asyncItemProcessorItemWriter/src/main/java/io/spring/batch/configuration/JobConfiguration.java

能否给我一些重试限制/自定义代码的示例,说明在使用 aysncprocessor / asyncitemwriter 出现任何异常时如何退出

更新 1-: 我尝试使用块大小为 100 的 5 个 aysnc 线程,重试限制为 3,我看到很少有记录只处理两次,很少有记录被处理三次,最后作业失败 ExhaustedRetryException

这是 Spring 批次的预期行为吗?

更新二:- 我在论坛中看到许多 post spring 重试 spring 重试和 faultTolerant(Spring 批处理)步骤重试之间的确切区别是什么?

SyncAsync 都可以配置重试,但有区别

  • 为了观察这一点,将 chunk 大小减小到 2
  • 当它是 Async 时,它提交块中的每个项目(在本例中为 2,假设两个项目在处理过程中都抛出异常),然后它会再次重试这两个项目,它会进行 3 (retryLimit) 轮。
    @Bean
    public Step step1() throws Exception {
        return stepBuilderFactory.get("step1")
                .chunk(2)
                .reader(pagingItemReader())
                .processor(asyncItemProcessor())
                .faultTolerant().retryLimit(3)
                                .retry(YourException.class)
                .writer(asyncItemWriter())
                .build();
    }

总结:

  • 当您使用 synchronous 处理器时,块中的项目将按顺序处理。因此,当一项失败时,仅根据 retryLimit
  • 重试该项目
  • 当您使用 asynchronous 处理器时,该块中的项目将被并行处理。因此,当其中一项或多项失败时,所有项目都会根据 retryLimit
  • 重试 3 次