2016-07-01 8 views
0

ステートマシンビルダーを使用してアプリケーションにステートマシンを構築しています。 また、アプリケーションには、org.springframework.statemachine.action.Actionを実装するActionクラスがあります。 これらのActionクラスは、各ステージの入力アクションを実行するためのクラスです。 これらのActionクラス、つまりexecute(StateContext paramStateContext)メソッドから例外がスローされた場合、エラーの詳細をdbに更新した後、その例外を捕捉してイベント(Terminated)を送信してステートマシンを終了状態にします。 stateMachineError(StateMachine stateMachine、Exception e)メソッドをオーバーライドして状態マシンリスナを使用しようとしました。しかし、残念ながら、これは動作していません。 他のスプリングステートマシンコンポーネントが例外をキャッチする前に、tryクラスでアクションクラスのコード全体をラップする前に、そしてステートマシンが終了状態をナビゲートするようにTerminatedイベントを送信するcatchブロック内に移動します。 ここではIamを使用してビルダーです。スプリングステートマシンのエントリアクションクラスからのコード/コンフィグレーションエラーの処理

+0

助けてください – user2330825

答えて

0

は、あなたが正しいなら、スプリング・ステートマシン・コア、どちらもstateMachineErrorまたは@onStateMachineErrorで注釈が付け方法の1.1.0.RELEASEバージョンを使用して


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()); 
      } 
     }; 
    } 

Iamは

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

はエラーで実行されています。これは、現在のマイルストーン1にあるバージョン1.2で取り上げられています。彼らは、ステートマシンのコンテキストで実行され errorActionを導入しました:

ユーザーは常に手動で例外をキャッチすることができますが、遷移のために定義されたアクションと、例外が発生した場合に呼び出されるエラー・アクションを定義することが可能です。そのアクションに渡されたStateContextから例外が利用できます。

ステートマシンコンフィグレーションクラスでトランジションを定義するときに、エラーアクションと目的のアクションを指定するだけです。 example in the documentationから:

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

本の詳細な議論は、春ステートマシンissue #240で見つけることができます。

関連する問題