2017-10-06 120 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