Papyrus を使用して、UML モデルに続くステート マシンを構築しようとしています。各ステージの entryActions は、 DefaultStateMachineComponentResolver を使用して登録され、Spring アプリのそれぞれの EntryAction クラスに解決されます。私の要件は
1) CS ステージから、トリガー イベント SUCCESS を取得すると、実行は 2 つのスレッドに分岐する必要があります。
2) 1 つのスレッドで DE1 と TE1 を順次実行し、別のスレッドで DE2 と TE2 を順次実行する必要があります。
3) END 状態への移行は、両方のスレッドが正常に実行された場合にのみ発生する必要があります。つまり、TE1 からは、イベント SUCCESS によって通知された状態に参加するために移行が発生し、TE2 からは、イベント SUCCESS によって通知された状態に参加するために移行が発生する必要があります。
4) すなわち。END 状態への遷移は、2 つのスレッドの実行が成功した後に発生する必要があります。
5) いずれかのタスクが失敗した場合 (タスクは EntryAction クラスで記述されます)、各ステージの実行中に、ステート マシンは END 状態に移動する必要があります。使用されるシグナルは FAILURE、TERMINATED (発生したエラーの重大度に基づく) です。
これは、ステートマシンを構築して実行をトリガーするために使用したコードです
Builder<String, String> builder = StateMachineBuilder
.<String, String> builder();
builder.configureConfiguration()
.withConfiguration()
.autoStartup(false)
.listener(listener())
.beanFactory(
this.applicationContext.getAutowireCapableBeanFactory());//.taskExecutor(taskExecutor());
DefaultStateMachineComponentResolver<String, String> resolver = new DefaultStateMachineComponentResolver<>();
resolver.registerAction("startEntryAction", this.startEntryAction);
resolver.registerAction("apEntryAction", this.apEntryAction);
resolver.registerAction("psEntryAction", this.psEntryAction);
//all entry action classed are registered
...
...
UmlStateMachineModelFactory umlStateMachineModelFactory = new UmlStateMachineModelFactory("classpath:model.uml");
umlStateMachineModelFactory.setStateMachineComponentResolver(resolver);
builder.configureModel().withModel().factory(umlStateMachineModelFactory);
StateMachine<String, String> stateMachine = builder.build();
stateMachine.start()
私が直面した問題
1) taskExecutor の使用中に、ステート マシンの実行が開始されませんでした。
2) taskExecutor をコメントアウトした後、exectuion がトリガーされ、コンソールで entryAction クラスからログを取得しました。
3)各エントリアクションクラスで、次の状態に遷移するため、およびログの目的で以下のコードを追加しました
@Override
public void execute(StateContext<String, String> paramStateContext) {
LOGGER.debug("Start State entered! ");
paramStateContext.getStateMachine().sendEvent("SUCCESS");
}
4) しかし問題は、ログを分析した後、TE1 が入力されていない状態です。私の要件は、TE1EntryAction と TE2EntryAction でタスクを実行した後に END 状態に入る必要があることでした。
ログの下で見つけてください
[![enter image description here][1]][1]19:03:54.963 DEBUG o.i.r.p.a.StartEntryAction - Start State entered!
19:03:55.007 DEBUG o.i.r.p.a.APEntryAction - AP State entered!
19:03:55.007 DEBUG o.i.r.p.a.PSEntryAction - PS State entered!
19:03:55.007 DEBUG o.i.r.p.a.PBEntryAction - PB State entered!
19:03:55.007 DEBUG o.i.r.p.a.CSEntryAction - CS State entered!
19:03:55.007 DEBUG o.i.r.p.a.DE1EntryAction - DE1 State entered!
19:03:55.007 DEBUG o.i.r.p.a.DE2EntryAction - DE2 State entered!
19:03:55.007 DEBUG o.i.r.p.a.TE2EntryAction - TE2 State entered!
19:03:55.023 DEBUG o.i.r.p.a.EndStateEntryAction - END State entered!
私が作成した UML モデルに問題がありますか。もしそうなら、ダイアグラムはどのように見えるべきか
助けてくれてありがとう。