如何在特定状态下构造状态机
How to construct state machine in a particular state
我正在使用 Spring Statemachine 来提供用户的工作流程。我需要保留状态更改,以便用户的状态不会在重新启动时丢失。现在,我可以根据提供的示例执行此操作,但是缺少的一件事是如果确实发生崩溃,如何重新创建状态。
基本上,我想创建状态机并告诉它自己设置为崩溃前的最后状态,并从数据库中复制任何扩展状态变量。有办法吗?
Persist
示例使用 PersistStateMachineHandler
方法在状态机在状态之间转换时更新数据库中的内容。在这个秘籍中要记住的一件重要事情是它使用拦截器而不是侦听器来挂钩状态变化。如果数据库更新是在拦截器回调中完成的,在 error/exception 的情况下,状态机中的转换被拒绝,而如果使用侦听器错误将导致状态机和数据库之间变得不一致。
另一件事是,此配方允许 reset
机器状态进入特定状态,然后从那里继续。
如果用户不关心速度和垃圾,是否为每次更新创建新机器真的无关紧要。状态机实例化相对昂贵,因此简单地使用一个实例然后重置其状态是相对轻松的操作。
目前,您如何通过状态机挂钩与数据库进行交互是非常低级的,因为您需要手动完成与数据库交互的所有操作。目前没有自动调整,因为我们根本不知道数据库中有什么以及如何更新行。
也许这可以帮到你:
stateMachine
.getStateMachineAccessor()
.doWithAllRegions(access -> {
access.resetStateMachine(new DefaultStateMachineContext<>({ResetState}, null, null, null, null));
});
stateMachine.start();
stateMachine.sendEvent({NewEventFromResetState});
我正在使用 Spring Statemachine 来提供用户的工作流程。我需要保留状态更改,以便用户的状态不会在重新启动时丢失。现在,我可以根据提供的示例执行此操作,但是缺少的一件事是如果确实发生崩溃,如何重新创建状态。
基本上,我想创建状态机并告诉它自己设置为崩溃前的最后状态,并从数据库中复制任何扩展状态变量。有办法吗?
Persist
示例使用 PersistStateMachineHandler
方法在状态机在状态之间转换时更新数据库中的内容。在这个秘籍中要记住的一件重要事情是它使用拦截器而不是侦听器来挂钩状态变化。如果数据库更新是在拦截器回调中完成的,在 error/exception 的情况下,状态机中的转换被拒绝,而如果使用侦听器错误将导致状态机和数据库之间变得不一致。
另一件事是,此配方允许 reset
机器状态进入特定状态,然后从那里继续。
如果用户不关心速度和垃圾,是否为每次更新创建新机器真的无关紧要。状态机实例化相对昂贵,因此简单地使用一个实例然后重置其状态是相对轻松的操作。
目前,您如何通过状态机挂钩与数据库进行交互是非常低级的,因为您需要手动完成与数据库交互的所有操作。目前没有自动调整,因为我们根本不知道数据库中有什么以及如何更新行。
也许这可以帮到你:
stateMachine
.getStateMachineAccessor()
.doWithAllRegions(access -> {
access.resetStateMachine(new DefaultStateMachineContext<>({ResetState}, null, null, null, null));
});
stateMachine.start();
stateMachine.sendEvent({NewEventFromResetState});