2017-10-06 8 views
0

非常に単純なスプリングステートマシンをまとめようとしていますが、ステートを変更したくないようです。
(Spring Stateを使用していますが、マシン、およびアプリケーションの残りの春アプリです、私はマシンを定義するために、アノテーション駆動型のアプローチを使用することはできません。私はビルダーを使用する必要があります)スプリングステートマシンは状態を変更しません

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

関連する問題