2016-07-01 6 views
0

Ich verwende einen State Machine Builder, um State Machine in meiner App zu erstellen. Auch die Anwendung verfügt über Aktionsklassen, die org.springframework.statemachine.action.Action implementiert. Diese Aktionsklassen dienen zum Ausführen von Eingabeaktionen für jede Phase. Wenn irgendeine Ausnahme von diesen Aktionsklassen ausgelöst wird, dh von der execute (StateContext paramStateContext) -Methode, wollte ich diese Ausnahme abfangen und ein Ereignis (Terminated) senden und die Zustandsmaschine in den Endzustand fahren, nachdem die db mit Fehlerdetails aktualisiert wurde. Ich habe versucht, den Listener der Statusmaschine zu verwenden, indem ich die Methode stateMachineError (StateMachine stateMachine, Exception e) außer Kraft setzte. Aber leider funktioniert das nicht. Jede andere Spring State Machine-Komponente zum Abfangen von Ausnahmen, bevor ich den gesamten Code in Aktionsklassen mit try catch umbrechen und innerhalb von catch blockiere das Terminated-Ereignis, so dass die Zustandsmaschine den End-Zustand durchläuft. Hier ist der Builder, den ich benutze.Behandeln von Code/Konfigurationsfehler von Eingabeaktionsklassen in Spring State Machine

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

Iam 1.1.0.RELEASE Version des Frühlings-state-Kern mit

+0

Jede Hilfe .. sehr geschätzt – user2330825

Antwort

0

Sie richtig sind, weder stateMachineError oder ein Verfahren mit @onStateMachineError kommentierten auf einem Fehler ausgeführt. Dies wird in der Version 1.2 angesprochen, die sich gerade im Meilenstein 1 befindet. Sie führten errorAction, die mit der Zustandsmaschine Kontext ausgeführt wird:

Der Benutzer kann immer Ausnahmen manuell fangen aber mit Aktionen für Übergänge definiert ist es möglich, Fehler Aktion zu definieren, die aufgerufen wird, wenn Ausnahme. Eine Ausnahme ist dann von einem StateContext verfügbar, der an diese Aktion übergeben wurde.

Sie müssen lediglich eine Fehleraktion zusammen mit der gewünschten Aktion angeben, wenn Sie einen Übergang in der Konfigurationsklasse der Statemachine definieren. Von der 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()); 
} 

Eine ausführliche Diskussion dieser kann im Frühjahr State issue #240 finden.