2017-10-06 7 views
0

Ich versuche, eine sehr einfache Spring State Machine zusammen, aber es scheint nicht zu ändern Status:
(Es ist wichtig zu beachten, dass, obwohl ich Spring State verwenden Maschine, und der Rest der Anwendung ist ein Frühling App, ich nicht die Anmerkung orientierten Ansatz verwenden, um die Maschine zu definieren. ich habe die Erbauer benutzen)Spring State Machine wird nicht den Zustand ändern

StateMachineBuilder.Builder<String, String> builder = StateMachineBuilder.builder(); 

    try { 
     builder.configureConfiguration() 
       .withConfiguration() 
       .beanFactory(new StaticListableBeanFactory()) 
       .listener(new StateMachineListenerAdapter<String, String>() { 
        @Override 
        public void stateChanged(State<String, String> from, State<String, String> to) { 
         System.out.println("State change to " + to.getId()); 
        } 
       }); 

     builder.configureStates() 
       .withStates() 
       .initial("initialState") 
       .states(Stream.of("initialState", "state1", "state2", "state3").collect(Collectors.toSet())) 
       .end("state3"); 

     builder.configureTransitions() 
       .withExternal() 
       .state("initialState") 
       .target("state1") 
       .event("event1") 
       .action(stateContext -> 
        System.out.println(String.format("Event %s triggered", stateContext.getEvent())) 
       ); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    StateMachine<String, String> stateMachine = builder.build(); 

    stateMachine.start(); 

    boolean complete = stateMachine.isComplete(); 
    System.out.println("Statemachine is complete: " + complete); 

    State<String, String> state = stateMachine.getState(); 
    System.out.println(state.getId()); 

    stateMachine.sendEvent("event1"); 

    state = stateMachine.getState(); 
    System.out.println(state.getId()); 

Wenn ich die oben laufen, erwarte ich, dass die Erster Zustand ist initialState, und wenn ich das Ereignis event1 sende, wird der Zustand zu state1 geändert. Ich erhalte die folgende Ausgabe:

State change to initialState 
Statemachine is complete: false 
initialState 
initialState 

Das sagt mir der Hörer einmal ausgelöst wird, wenn die Maschine zum ersten Mal startet und stellt den Ausgangszustand, dass aus irgendeinem Grund die Zustandsmaschine Berichte es unvollständig ist, dass der Staat initialState bevor ich Senden Sie das Ereignis, und dass der Zustand immer noch initialState ist, nachdem ich das Ereignis gesendet habe.
Es gibt keine Fehler beim Starten des Zustandsautomaten oder beim Senden des Ereignisses, und die Aktion im Übergang wird nie ausgeführt.

Was fehlt mir?

Antwort

0

Ich habe das Problem gefunden - ich habe den Übergang falsch konfiguriert! Dies ist
, wie es sein sollte:

builder.configureTransitions() 
      .withExternal() 
      .source("initialState") 
      .target("state1") 
      .event("event1") 
      .action(stateContext -> 
       System.out.println(String.format("Event %s triggered", stateContext.getEvent())) 
      ); 

IE. Ich rief ursprünglich .state, die es .source

hätte sein sollen
Verwandte Themen