Spring 如何在特定状态下构造状态机

Spring 如何在特定状态下构造状态机,spring,spring-boot,spring-statemachine,Spring,Spring Boot,Spring Statemachine,我使用SpringStateMachine提供用户的工作流。我需要保持状态更改,以便在重新启动时不会丢失用户的状态。现在,我可以根据提供的示例来执行此操作,但是缺少的一件事是,如果发生崩溃,如何重新创建状态 基本上,我想创建状态机,告诉它将自己设置为崩溃前的最后一个状态,并从数据库中复制任何扩展状态变量。有办法做到这一点吗?当状态机在状态之间转换时,Persist示例使用PersistStateMachineHandler recipe更新数据库中的内容。在这个方法中需要记住的一点是,它使用拦截

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

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

当状态机在状态之间转换时,Persist示例使用PersistStateMachineHandler recipe更新数据库中的内容。在这个方法中需要记住的一点是,它使用拦截器而不是侦听器来钩住状态更改。如果db更新是在拦截器回调中完成的,在出现错误/异常的情况下,状态机中的转换将被拒绝,而如果使用侦听器,则错误将导致状态机和db之间变得不一致

另一件事是,该配方允许将机器状态重置为特定状态,然后从那里继续

若用户不关心速度和垃圾,那个么是否为每次更新都创建了新的机器其实并不重要。状态机实例化相对昂贵,因此只需使用一个实例,然后重置其状态,操作相对轻松


目前,您如何从状态机钩子与db交互的级别非常低,因为您需要手动完成如何与db交互的所有工作。目前没有自动调整,因为我们根本不知道数据库中有什么以及行将如何更新。

也许这可以帮助您:

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

在未来的版本中,这方面的特性会越来越好,但根据您遵循的示例,您可以重置机器状态。您并没有提到您是否有多个用户,或者机器是否只是一个用户的静态机器。持久化的例子是使用机器来更新数据库,它将重置状态,尽管此时非常手动。你觉得你也可以这么做吗?对,我想知道这是一个黑客攻击还是可以正常工作。现在,每个用户在会话中都有自己的状态机。当他们开始时,我需要检查数据库,看看他们是否有一个不完整的工作流,并创建一个与他们离开时状态相同的状态机。我将尝试使用与示例中相同的重置机制。我添加了一个简单的答案。如果您对如何使machine/db集成更容易有任何想法,请随意创建github票据,我们可以继续。我讨厌您需要手动使用jdbcTemplate。如果我们能以某种方式自动完成任务,那就太好了,所以任何关于这方面的想法都会很好!对,我看不出有太多的选择。我选择了拦截器选项,在每次状态更改时将当前状态和扩展状态持久化到redis集群中。我目前在标题字段中使用状态机id来检查用户获得的机器是否是用户一直在使用的机器。如果存在不匹配,我将加载旧机器的数据,并将新机器重置为该数据。到目前为止,它在测试中有效。我还是一个初学者。我正在看持久化配方和示例代码。我仍然想知道这种“重置”到底发生在哪里。