在 spring 个批处理异步处理器中重试
retry in spring batch asyncprocessor
我们正在构建一个 spring 批处理,它在 spring 批处理
的处理器部分调用第三方 API
要求是当第 3 方 API 不可用时 spring 批处理需要重试指定的阈值限制并中止批处理
我已经尝试 spring 使用容错步骤进行批处理重试,它在单线程程序中工作正常,但是当我们包含 aysncprocessor 和 aysncitemwriter 时,它不会停止批处理
能否给我一些重试限制/自定义代码的示例,说明在使用 aysncprocessor / asyncitemwriter 出现任何异常时如何退出
更新 1-:
我尝试使用块大小为 100 的 5 个 aysnc 线程,重试限制为 3,我看到很少有记录只处理两次,很少有记录被处理三次,最后作业失败 ExhaustedRetryException
这是 Spring 批次的预期行为吗?
更新二:-
我在论坛中看到许多 post spring 重试 spring 重试和 faultTolerant(Spring 批处理)步骤重试之间的确切区别是什么?
Sync
和 Async
都可以配置重试,但有区别
- 为了观察这一点,将
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 次
我们正在构建一个 spring 批处理,它在 spring 批处理
的处理器部分调用第三方 API要求是当第 3 方 API 不可用时 spring 批处理需要重试指定的阈值限制并中止批处理
我已经尝试 spring 使用容错步骤进行批处理重试,它在单线程程序中工作正常,但是当我们包含 aysncprocessor 和 aysncitemwriter 时,它不会停止批处理
能否给我一些重试限制/自定义代码的示例,说明在使用 aysncprocessor / asyncitemwriter 出现任何异常时如何退出
更新 1-:
我尝试使用块大小为 100 的 5 个 aysnc 线程,重试限制为 3,我看到很少有记录只处理两次,很少有记录被处理三次,最后作业失败 ExhaustedRetryException
这是 Spring 批次的预期行为吗?
更新二:- 我在论坛中看到许多 post spring 重试 spring 重试和 faultTolerant(Spring 批处理)步骤重试之间的确切区别是什么?
Sync
和 Async
都可以配置重试,但有区别
- 为了观察这一点,将
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 次