如何重试失败的操作?

How to retry a failed action?

我浏览了 Spring Statemachine 文档,但没有找到某些场景的明确答案。如果有人能澄清我的问题,我将不胜感激。

场景1:如何重试与操作失败相关的错误?假设我有以下状态 S1、S2 和 S3,当我们从 S1 转换到 S2 时,我想执行操作 A2。如果 A2 操作失败,我想隔一段时间重试一次。可以使用 Spring StateMachine 吗?

以 AWS 状态机 Step Functions 为例。步骤函数状态中的所有工作都是使用任务完成的。并且任务可以配置为重试。

transitions
            .withExternal()
                .source(States.S1)
                .target(States.S2)
                .event(Events.E1)
                .action(action());

场景 2:假设状态机具有状态 S1、S2 和 S3。当前状态为 S2。如果服务器在启动时出现故障,Statemachine 会从中断的地方继续执行,还是我们必须重新做一遍?

场景 3:当 Guard returns false(可能是因为错误条件)并阻止转换时接下来会发生什么?

How to retry a failed action?

Spring 状态机中有两种类型的动作 - 转换动作和状态动作。在场景 1 中,您正在谈论过渡操作。

指定转换动作时,还可以指定动作失败时的错误处理程序。 spring 状态机 documentation.

中清楚地记录了这一点
.withExternal()
    .source(States.S1)
    .target(States.S2)
    .event(Events.E1)
    .action(action(), errorAction());

在您的 errorAction() 方法中,您可以实现您的逻辑。 可能的选项是:

  • 转换到较早的状态并走相同的路径
  • 转换到特定状态(例如重试状态),您可以在其中拥有重试逻辑(例如 Task/Executor 重试操作 N 次,然后转换到其他状态(例如操作成功 => 进入正常流程; 重试 N 次后操作失败 => 转换为失败终端状态)

还有 official Tasks example, that demonstrates recovery/retry logic (source code)。