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?