2017-10-06 4 views
0

J'essaie de mettre en place une très simple Spring State Machine, mais il ne semble pas vouloir changer d'état:
(Il est important de noter que même si j'utilise Spring State Machine, et le reste de l'application est une application Spring, je ne peux pas utiliser l'annotation approche axée sur pour définir la machine. Je dois utiliser les constructeurs)Spring State Machine ne change pas d'état

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

Quand je lance ce qui précède, je me attends à ce que la le premier état est initialState, et que lorsque j'enverrai l'événement event1 l'état sera changé en state1. Je reçois la sortie suivante:

State change to initialState 
Statemachine is complete: false 
initialState 
initialState 

Cela me dit l'auditeur se déclenche une fois lorsque la machine commence d'abord et définit l'état initial, que pour une raison quelconque les rapports de la machine de l'Etat, il est incomplet, que l'état est initialState avant envoyer l'événement, et que l'état est toujours initialState après avoir envoyé l'événement.
Il n'y a pas d'erreur au démarrage de la machine d'état, ou lorsque j'envoie l'événement, et l'action dans la transition n'est jamais exécutée.

Qu'est-ce qui me manque?

Répondre

0

J'ai trouvé le problème - je ne configurais pas correctement la transition!
Voici comment il devrait être:

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

IE. J'appelais à l'origine .state, ce qui aurait dû être .source