2016-06-16 6 views
2

Iやったすべてのエラー処理するために春ステートマシンエラーが機能していない取り扱い

@PostConstruct 
public void addStateMachineInterceptor() { 
    stateMachine.getStateMachineAccessor().withRegion().addStateMachineInterceptor(interceptor); 
    stateMachine.getStateMachineAccessor().doWithRegion(errorinterceptor); 
} 

作成したインターセプタをエラー処理のためのセットアップ:

@Service 
public class OrderStateMachineFunction<T> implements StateMachineFunction<StateMachineAccess<String, String>> { 
    @Override 
    public void apply(StateMachineAccess<String, String> stringStringStateMachineAccess) { 
     stringStringStateMachineAccess.addStateMachineInterceptor(
       new StateMachineInterceptorAdapter<String, String>() { 
        @Override 
        public Exception stateMachineError(StateMachine<String, String> stateMachine, 
                 Exception exception) { 
         // return null indicating handled error 
         return exception; 
        } 
       }); 
    } 
} 

をしかし、私は、コールがOrderStateMachineFunctionに入る見ることができません、私たちがアクションから例外をスローするとき。

そして、そのステートマシンは、this.stateMachine.sendEvent(eventData);の後にpreStateChangeメソッドを呼び出すのを止めるように、いくつかの有線で動作します。アクションから例外をスローした後は、状態マシンが故障しているようです。いくつかのビットをしようとした後

@Service 
    public class OrderStateMachineInterceptor extends StateMachineInterceptorAdapter { 

     @Override 
     public void preStateChange(State newState, Message message, Transition transition, StateMachine stateMachine) { 
      System.out.println("Manish"); 
    } 
} 

、私はresetStateMachineコメント場合、期待どおりに動作しますが、それなしで、私は、ステートマシンにcurrentStateのを通知することはできませんよということ見てきた:

public boolean fireEvent(Object data, String previousState, String event) { 
     Message<String> eventData = MessageBuilder.withPayload(event) 
       .setHeader(DATA_KEY, data) 
       .build(); 
     this.stateMachine.stop(); 

//  this.stateMachine 
//    .getStateMachineAccessor() 
//    .withRegion() 
//    .resetStateMachine(new DefaultStateMachineContext(previousState, event, eventData.getHeaders(), null)); 

     this.stateMachine.start(); 
     return this.stateMachine.sendEvent(eventData); 
    } 
+0

エラー処理は現在選択できません。https://github.com/spring-projects/spring-statemachine/issues/183を参照してください。少なくとも、私はそれを働かせることはできませんでした。 – Paul

+0

この問題はhttps://github.com/spring-projects/spring-statemachine/issues/240で修正されているようです – krmanish007

答えて

0

ありませんあなたがまだこれを必要とするかどうか確かめてくださいしかし、私は同様の問題にぶつかった。ステートマシンから発信者に例外を伝播したかったのです。私はStateMachineInterceptorを実装しました。そして、私は設定していますステートマシンの遷移関数の内部:

try 
     { 
      .. 
     } 
     catch (WhateverException e) 
     { 
      stateMachine.setStateMachineError(e); 
      throw e; 
     } 

を次にインターセプタのstateMachineErrorメソッドの内部で、私はextendedStateマップに例外を追加しました:resetStateMachineインサイド

public Exception stateMachineError(StateMachine<States, Events> stateMachine, Exception exception) 
{ 
stateMachine.getExtendedState().getVariables().put("ERROR", exception); 
logger.error("StateMachineError", exception); 
return exception; 
} 

を私がするインターセプタを追加しましたステートマシン。私はのSendEventメソッドを呼び出していたときに

a.addStateMachineInterceptor(new LoggingStateMachineInterceptor()); 

はその後、私はこれをやっている:

if (stateMachine.hasStateMachineError()) 
     { 
      throw (Exception) svtStateMachine.getExtendedState().getVariables().get("ERROR"); 
     } 

これは、右の呼び出し元にWhateverExceptionを返して。私の場合はRestControllerです。

関連する問題