据我了解 Tasklet 和 StepExecutionListener 之间的交互是这样发生的:
beforeStep()
方法。这
提供执行任何必要的初始化或
在步骤开始之前设置任务。execute()
方法,处理
大块的物品。 Tasklet 执行核心处理逻辑
每个块。 StepContribution 和 ChunkContext 被传递到
Tasklet,提供有关当前块和当前块的信息
步骤的执行。afterStep()
方法。这
提供执行任何清理或完成任务的机会
该步骤完成后。考虑
execute()
失败的情况。为此,我想对该步骤执行 5 次重试,直到该步骤在侦听器中成功。
我对春天很陌生。以下是我希望澄清的问题:
beforeStep()
,然后调用 Tasklet 的 execute()
,然后调用 StepExecutionListener 的 afterStep()
。他们之间如何共享信息? (如果有相关的好的文档,请分享)
- 这在内部是如何运作的?谁调用了StepExecutionListener的beforeStep(),然后调用Tasklet的execute(),然后调用StepExecutionListener的afterStep()。他们之间如何共享信息? (如果有相关的好的文档,请分享)
正是 AbstractStep 类驱动 Spring Batch 提供的所有
Step
实现的执行(当使用 tasklet 时,TaskletStep
是其中之一)。
- 有更好的方法吗?
我想是的。步骤执行监听器并不是实现重试的最佳位置(将重试逻辑放入监听器要么太早,要么太晚)。对于面向块的tasklet,Spring Batch已经提供了重试功能(只需在构建面向块的tasklet时指定重试策略即可)。
对于简单的tasklet(即不是面向项目的),没有内置的重试功能。您可以做的是在
RetryTemplate
内使用 tasklet#execute
,并通过在 5 次重试后抛出异常来处理任何失败。