java - Spring StateMachineの再利用可能なステートマシンインスタンス

okwaves2024-01-25  9

以下の画像のようなスプリング ステート マシンがあります。

アプリの開始時にステート マシンを開始したいと考えています。その後、再状態になり、ある時点 (スケジュール済み) でサブ状態 (GetA、GetB、および GetC) を持つ GetOrders 状態になります。その後、何らかのエラーがある場合はエラーに移行し、そうでない場合は、すべてが正常であれば Re-State に移行し、スケジューラを待機する必要があります。

これは私の構成です

@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-State になるはずだからです。これは待機状態と見なすことができます。



------------------------

StateMachineFactory から明示的にステート マシン インスタンスを取得するのではなく、SpringStateMachineService を使用してステート マシン インスタンスを取得してみてください。 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 を指定する必要があります。通常、それらをデータベースに保存し、クエリを実行して、それぞれのステート マシンをインスタンス化します。 永続的ステートマシンのコンテキストは問題の範囲外です。 「ステートマシンの永続化」

を参照してください。



------------------------

そうですね、ステート マシンはおそらくパブリックで静的であるはずです。そのため、マシンのインスタンスが 1 つだけであることを確認します。

3

StateMachine の作成を静的および公開に変更しました。lic ですが、それでも UUID は異なります :)

– xmlParser

2020 年 9 月 3 日 11:35

実際に遊んでテストできるように、もう少しコードを提供する必要があると思います。

– リッカート・ブランドセン

2020 年 9 月 3 日 12:38

さらにコードを提供するとはどういう意味ですか?状態とイベントの列挙、遷移構成、状態構成、アクション?それはどれも役に立たないと思います...それは単なる基本的な設定です

– xmlParser

2020 年 9 月 3 日 12:42

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。