0

ステート マシン ビルダーを使用して、アプリでステート マシンを構築しています。また、アプリケーションには、org.springframework.statemachine.action.Action を実装する Action クラスがあります。これらの Action クラスは、各ステージのエントリ アクションを実行するためのものです。これらの Action クラス、つまり execute(StateContext paramStateContext) メソッドから例外がスローされた場合、エラーの詳細でデータベースを更新した後、その例外をキャッチしてイベント (Terminated) を送信し、ステート マシンを End 状態にする必要がありました。stateMachineError(StateMachine stateMachine, Exception e) メソッドをオーバーライドして、ステート マシン リスナーを使用しようとしました。しかし、残念ながらこれは機能していません。例外をキャッチするためのその他のスプリング ステート マシン コンポーネント。ステート マシンが End 状態をナビゲートするように Terminated イベントを送信する catch ブロック内。これが私が使用しているビルダーです。

Builder<String, String> builder = StateMachineBuilder
                .<String, String> builder();
        builder.configureConfiguration()
        .withConfiguration()
        .autoStartup(false)
        .listener(listener())
                .beanFactory(
                this.applicationContext.getAutowireCapableBeanFactory());

private StateMachineListener<String, String> listener() {
        return new StateMachineListenerAdapter<String, String>() {
            @Override
            public void stateChanged(
                    org.springframework.statemachine.state.State<String, String> from,
                    org.springframework.statemachine.state.State<String, String> to) {
                LOGGER.debug("State change to " + to.getId());
            }

            @Override
            public void stateMachineError(
                    StateMachine<String, String> stateMachine, Exception e) {
                e.printStackTrace();
                LOGGER.debug("Ah... I am not getting executed when exception occurs from entry actions");
                LOGGER.debug("Error occured from  " + stateMachine.getState()
                        + "and the error is" + e.toString());
            }
        };
    }

spring-statemachine-core の 1.1.0.RELEASE バージョンを使用しています

4

1 に答える 1

0

あなたは正しいです、どちらも、stateMachineErrorまたは で注釈@onStateMachineErrorが付けられたメソッドはエラー時に実行されません。これは、現在マイルストーン 1 にあるバージョン 1.2 で対処されています。彼らerrorActionは、ステートマシンのコンテキストで実行されるものを紹介しました:

ユーザーはいつでも手動で例外をキャッチできますが、トランジション用に定義されたアクションを使用して、例外が発生した場合に呼び出されるエラー アクションを定義することができます。その後、そのアクションに渡された StateContext から例外が利用可能になります。

必要なのは、ステート マシン構成クラスで遷移を定義するときに、必要なアクションと共にエラー アクションを指定することだけです。ドキュメントの例から:

public void configure(StateMachineTransitionConfigurer<States, Events> transitions)
        throws Exception {
    transitions
        .withExternal()
            .source(States.S1)
            .target(States.S2)
            .event(Events.E1)
            .action(action(), errorAction());
}

これに関する詳細な議論は、Spring Statemachine issue #240にあります。

于 2016-10-01T15:36:40.003 に答える