spring statemachine可重用statemachine示例

dluptydi  于 2021-07-05  发布在  Java
关注(0)|答案(2)|浏览(450)

我有如下图所示的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状态。可以认为是等待状态。

cclgggtu

cclgggtu1#

你的状态机应该是公共的和静态的。这样你就可以确保你的机器只有一个示例。

1yjd4xko

1yjd4xko2#

尝试使用springstatemachineservice获取状态机示例,而不是从statemachinefactory显式检索它。您可以使用spring提供的默认实现:

@Bean
public StateMachineService<State, Event> stateMachineService(
        final StateMachineFactory<State, Event> stateMachineFactory) {
    return new DefaultStateMachineService<>(stateMachineFactory);
}

因此,您的代码将如下所示:

@Scheduled(cron = "0 0 1 1 * *")
public void startStateMachine() {
    // here we need to get stateMachineId from some storage
    stateMachineService.acquireStateMachine(stateMachineId, true)
            .sendEvent(Events.ReState);
}

在上面的代码中,您需要提供特定的状态机ID。通常,我将它们存储在数据库中,查询它们并为每一个示例示例化状态机。持久化状态机上下文超出了问题的范围。请参阅持久状态机

相关问题