以下の画像のようなスプリング ステート マシンがあります。
アプリの開始時にステート マシンを開始したいと考えています。その後、再状態になり、ある時点 (スケジュール済み) でサブ状態 (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