如何重试失败的操作?

时间:2019-04-24 16:28:18

标签: spring spring-statemachine

我浏览了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(可能是由于错误情况所致)并阻止过渡时,接下来会发生什么?

1 个答案:

答案 0 :(得分:0)

  

如何重试失败的操作?

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

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

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

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

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

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