首页 > 解决方案 > 如何从服务器关闭之前的最后一个状态恢复弹簧状态机?

问题描述

假设我想使用状态为 -(S1,S2,S3) 的 SSM 在电子商务网站上对订单进行建模。当服务器重新启动时,特定的订单在 S2。我希望订单能够从 S2 中提取并在下次恢复。我能想到的一种方法是在订单从 S1 转换到 S2 之后将 SSM ID 和状态“S2”保存在数据库中。除此之外,我们可以有一个管理面板,任何人都可以在其中输入 SSM ID 并提交。此 SSM ID 可用于从数据库中检索订单的状态。但是,我将不得不编写一个 if-else 块来发出一个适当的事件,它看起来像:

if (stateFromDatabase.equals("S1") {
    stateMachine.sendEvent("E1");
} else if (stateFromDatabase.equals("S2")) {
    stateMachine.sendEvent("E2");
} else if (stateFromDatabase.equals("S3")) {
    stateMachine.sendEvent("E3");
}

这似乎不是一件体面的事情,我想知道是否有更好的方法来做到这一点。

标签: javaspringspring-bootspring-data-jpaspring-statemachine

解决方案


您描述的用例与Persist Recipe非常相似。如果要处理重新启动的服务器,则需要持久性存储。在您的情况下,我会为每个订单在数据库中保留一个状态机实例,您可以为机器提供任何 ID(包括订单 ID),或按顺序映射机器 UUID。

机器当前状态也保持不变,并应反映订单状态,以防您在订单本身中没有它


推荐阅读