2017-10-06 132 views
0

我试图把一个非常简单的春天状态机,但它似乎并不想改变状态:
(重要的是要注意,即使我使用的是Spring State机和应用程序的其余部分是一个Spring应用程序,我不能使用注解驱动的方式来定义的机器。我必须使用的建设者)春天状态机不会改变状态

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

当我运行上面的,我期待的是,第一个状态是initialState,并且当我发送事件event1时,状态将更改为state1。我得到以下输出:

State change to initialState 
Statemachine is complete: false 
initialState 
initialState 

这告诉我的听众触发一次当机器第一次启动,并设置初始状态,由于某种原因,状态机报告,它是不完整的,这状态是initialState我之前发送事件,并且发送事件后状态仍为initialState
在启动状态机或我发送事件时都没有错误,并且转换中的操作从不运行。

我错过了什么?

回答

0

我发现了这个问题 - 我错误地配置了转换!
这是应该的:

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

IE。我原本打电话给.state,应该是.source