在Spring Batch中的StepExecutionListener中实现重试

问题描述 投票:0回答:1

据我了解 Tasklet 和 StepExecutionListener 之间的交互是这样发生的:

  1. Step 之前: 调用 StepExecutionListener 的
    beforeStep()
    方法。这 提供执行任何必要的初始化或 在步骤开始之前设置任务。
  2. Tasklet执行:反复调用Tasklet的
    execute()
    方法,处理 大块的物品。 Tasklet 执行核心处理逻辑 每个块。 StepContribution 和 ChunkContext 被传递到 Tasklet,提供有关当前块和当前块的信息 步骤的执行。
  3. Step 之后: 调用 StepExecutionListener 的
    afterStep()
    方法。这 提供执行任何清理或完成任务的机会 该步骤完成后。

考虑

execute()
失败的情况。为此,我想对该步骤执行 5 次重试,直到该步骤在侦听器中成功。

我对春天很陌生。以下是我希望澄清的问题:

  1. 这在内部是如何运作的?谁调用了 StepExecutionListener 的
    beforeStep()
    ,然后调用 Tasklet 的
    execute()
    ,然后调用 StepExecutionListener 的
    afterStep()
    。他们之间如何共享信息? (如果有相关的好的文档,请分享)
  2. 有更好的方法吗?
java spring spring-batch listener spring-batch-tasklet
1个回答
0
投票
  1. 这在内部是如何运作的?谁调用了StepExecutionListener的beforeStep(),然后调用Tasklet的execute(),然后调用StepExecutionListener的afterStep()。他们之间如何共享信息? (如果有相关的好的文档,请分享)

正是 AbstractStep 类驱动 Spring Batch 提供的所有

Step
实现的执行(当使用 tasklet 时,
TaskletStep
是其中之一)。

  1. 有更好的方法吗?

我想是的。步骤执行监听器并不是实现重试的最佳位置(将重试逻辑放入监听器要么太早,要么太晚)。对于面向块的tasklet,Spring Batch已经提供了重试功能(只需在构建面向块的tasklet时指定重试策略即可)。

对于简单的tasklet(即不是面向项目的),没有内置的重试功能。您可以做的是在

RetryTemplate
内使用
tasklet#execute
,并通过在 5 次重试后抛出异常来处理任何失败。

© www.soinside.com 2019 - 2024. All rights reserved.