如何在特定状态下构建状态机

时间:2015-10-07 14:16:23

标签: spring spring-boot spring-statemachine

我使用Spring Statemachine来提供用户的工作流程。我需要保持状态更改,以便在重新启动时不会丢失用户的状态。现在,我可以根据提供的示例执行此操作,但是缺少的一件事是如果发生崩溃,如何重新创建状态。

基本上,我想创建状态机并告诉它将自己设置为崩溃前的最后状态,并从数据库中复制任何扩展状态变量。有没有办法做到这一点?

2 个答案:

答案 0 :(得分:5)

当状态机在状态之间转换时,

Persist示例使用PersistStateMachineHandler配方更新数据库中的内容。在这个方法中要记住的一件重要事情是它使用拦截器而不是监听器来挂钩状态变化。如果db update在拦截器回调中完成,则在出现错误/异常的情况下,状态机中的转换被拒绝,而如果使用侦听器错误则会导致状态机和db在彼此之间变得不一致。

另一件事是这个配方允许reset机器状态进入特定状态,然后从那里继续。

如果用户不关心速度和垃圾,是否为每次更新创建了新机器并不重要。状态机实例化相对昂贵,因此简单地使用一个实例然后重新设置其状态是相对较轻的操作。

此时如何从状态机挂钩与db进行交互是非常低级别的,因为您需要在如何与db交互方面手动完成所有操作。目前没有自动调整,因为我们根本不知道db中的内容以及如何更新行。

答案 1 :(得分:5)

也许这可以帮到你:

stateMachine
                .getStateMachineAccessor()
                .doWithAllRegions(access -> {
                    access.resetStateMachine(new DefaultStateMachineContext<>({ResetState}, null, null, null, null));
                });
stateMachine.start();
stateMachine.sendEvent({NewEventFromResetState});