【问题标题】:How to retry a failed action?如何重试失败的操作?
【发布时间】:2019-04-24 16:28:17
【问题描述】:

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

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

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

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

场景 2:假设状态机具有状态 S1、S2 和 S3。当前状态为 S2。如果服务器在启动时出现故障,Statemachine 的执行是否会从它停止的地方重新开始,或者我们将不得不从头再来?

场景 3:当 Guard 返回 false(可能是由于错误条件)并阻止转换时,接下来会发生什么?

【问题讨论】:

  • 场景2和3与重试逻辑无关。它们是完全不同的问题。

标签: spring spring-statemachine


【解决方案1】:

如何重试失败的操作?

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

当你指定一个转换动作时,如果动作失败,你也可以指定一个错误处理程序。这在弹簧状态机documentation 中有明确记录。

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

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

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

还有 official Tasks example,它演示了恢复/重试逻辑 (source code)。

【讨论】:

  • 感谢您的回答。我尝试了您上面提到的两个选项进行重试。如果可能的话,为了上述问题的答案的完整性,您还可以提供方案 2 和方案 3 的答案。之后我会接受答案。谢谢。
  • @MuneerY 场景 2 和 3 与您的主要问题无关——我看不出它们如何带来“完整性”——实际上恰恰相反——它们会带来混乱。也许考虑在单独的问题中提出这些问题。
猜你喜欢
  • 2022-06-14
  • 1970-01-01
  • 1970-01-01
  • 2017-02-14
  • 1970-01-01
  • 2021-05-16
  • 2017-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多