1

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 モデルに問題がありますか。もしそうなら、ダイアグラムはどのように見えるべきか

助けてくれてありがとう。

ここに画像の説明を入力

4

1 に答える 1

0

直交領域を使用しないとフォーク/ジョインできないため、少なくともフォーク/ジョインは間違っています。

シンプルフォークジョインチャート

上記のソースはsimple-forkjoin.uml にあります

UML仕様が明確に述べているように、パピルスがそのようにフォーク/ジョインを描画できる理由がわかりません:

フォーク疑似状態は、入ってくる遷移を、複合状態の直交領域の頂点で終了する 2 つ以上の遷移に分割する役割を果たします。

ユーザーがリージョンを使用せずにフォーク/ジョインを追加しようとしている場合は、おそらくモデル検証ツールを追加する必要があります。

TE2また、マシンが参加を待機している場合、からへの移行で何が起こるべきかわからないENDので、それを避けようとします。

于 2016-08-11T07:42:14.070 に答える