如何重试失败的动作?

Muneer Y:

我浏览了Spring Statemachine文档,但在某些情况下没有找到明确的答案。如果有人可以澄清我的问题,我将不胜感激。

方案1:如何重试与操作失败有关的错误?可以说我有以下状态S1,S2和S3,当我们从S1过渡到S2时,我想执行操作A2。如果操作A2失败,我希望每隔一段时间重试一次。使用Spring StateMachine有可能吗?

例如,请考虑AWS状态机的“步骤功能”。步骤功能状态中的所有工作均使用Task完成。并且可以配置Task以便重试。

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

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

方案3:当后卫返回false(可能是由于错误情况)并阻止过渡时,接下来会发生什么?

hovanessyan:

如何重试失败的动作?

Spring State Machine中有两种类型的动作-过渡动作和状态动作。方案1中,您正在谈论过渡动作。

指定过渡动作时,如果动作失败,也可以指定错误处理程序。弹簧状态机文档中清楚地记录了这一点

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

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

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

还有官方的Tasks示例,演示了恢复/重试逻辑(源代码)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章