我有如下图所示的spring状态机:
我想在应用程序启动时启动状态机。在那之后,它应该进入re状态,在某个时间(计划的),它进入状态getorders和子状态(geta,getb和getc)。之后,如果有一些错误,它应该进入错误,否则如果一切正常,它应该进入re状态,它应该等待调度程序。
这是我的配置
@Override
public void configure(StateMachineConfigurationConfigurer<States, Events> config) throws Exception {
config.withConfiguration()
.autoStartup(true)
.machineId("orderMachine");
}
这是调度程序的方法:
@Scheduled(cron = "0 0 1 1 * *")
public void startStateMachine() {
StateMachine<States, Events> sm = factory.getStateMachine();
sm.start();
sm.sendEvent(Events.ReState);
}
一切正常,但我注意到每次执行这个方法时,启动的statemachine与前一个有不同的uuid,但是id是相同的。所以我想我正在创建状态机的多个示例。是否可以重用相同的状态机或不完成该过程。因为在我的情况下,大部分时间机器的状态应该是re状态。可以认为是等待状态。
2条答案
按热度按时间cclgggtu1#
你的状态机应该是公共的和静态的。这样你就可以确保你的机器只有一个示例。
1yjd4xko2#
尝试使用springstatemachineservice获取状态机示例,而不是从statemachinefactory显式检索它。您可以使用spring提供的默认实现:
因此,您的代码将如下所示:
在上面的代码中,您需要提供特定的状态机ID。通常,我将它们存储在数据库中,查询它们并为每一个示例示例化状态机。持久化状态机上下文超出了问题的范围。请参阅持久状态机