【问题标题】:retry in spring batch asyncprocessor在春季批处理异步处理器中重试
【发布时间】:2020-06-29 10:59:46
【问题描述】:

我们正在构建一个 Spring Batch,它在 Spring Batch 的处理器部分调用第三方 API

要求是当第 3 方 API 不可用时,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 批处理的预期行为吗?

更新 2:- 我在论坛上看到很多关于 spring retry 的帖子 spring retry 和 faultTolerant (Spring Batch) step retry 之间的确切区别是什么?

【问题讨论】:

  • @KavithakaranKanapathippillai:这在 aysncprocessor 中不起作用:(
  • it is working fine in a single threaded program but is is not stopping the batch when we include aysncprocessor and aysncitemwriter:既然它工作正常,让我们看看它为什么没有停止。您是否为异步组件使用线程池执行器?如果是,您是否在工作后关闭此线程池? Spring Batch 不会自行关闭线程池。
  • 是的,我们正在使用任务执行器,但我们并没有关闭它,我们虽然 SpringApplication.exit(context) 会小心
  • 它在单线程程序中运行良好,但是当我们包含 aysncprocessor 和 aysncitemwriter 时并没有停止批处理:这里我的意思是说,即使抛出异常,批处理也会继续处理并且处理器不会退出

标签: java spring spring-batch


【解决方案1】:

SyncAsync 均可配置重试,但有区别

  • 为了观察这一点,将chunk 的大小减小到 2
  • 当它是Async时,它会提交块中的每个项目(在这种情况下是2,假设两个项目在处理过程中都抛出异常),然后它会再次重试这两个项目,它会做3(@ 987654325@) 轮。
    @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 次

【讨论】:

  • 我会在一段时间内检查并更新感谢您的解释:)
  • 我检查了我的块大小是 100,有 5 个线程,我发现很少有记录只处理了 2 次,即使重试限制为 3,作业也因 ExhaustedRetryException 而失败,担心使用此重试功能
  • 在同步模式下,在批处理实现和重试之前的最大失败是 1 条记录。但在异步模式下,它将并行处理记录。这意味着一旦一个线程检测到故障,它就无法停止其他线程。因此,在您的情况下,它将重试所有日常记录。但它会等到所有线程都完成了手头的当前项目。即最多 5 个。它仍然是可靠的,因为它仍然会重试
  • 嗨,我一直在尝试研究一些记录被处理了四次,所以我的问题是如果只有一条记录在 100 的块大小中失败会发生什么情况,它会失败整个步骤吗?也不确定虽然重试限制为 3,但有些记录已处理 4 次,非常感谢您的帮助和指导 :)
猜你喜欢
  • 2018-02-08
  • 2020-08-10
  • 1970-01-01
  • 2014-12-15
  • 2018-05-27
  • 2015-05-13
  • 2017-06-25
  • 2018-04-03
  • 2015-09-09
相关资源
最近更新 更多