2017-10-06 7 views
0

아주 간단한 스프링 상태 머신을 조합하려고하는데 상태를 변경하고 싶지 않습니다.
(스프링 상태를 사용 중이지만 기계, 응용 프로그램의 나머지 부분은. 내가 위를 실행하면)스프링 상태 머신 상태 변경 안 함

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이고, 이벤트를 보낼 때 event1state1으로 변경됩니다.

State change to initialState 
Statemachine is complete: false 
initialState 
initialState 

이 리스너가 한 번 트리거 할 때 컴퓨터 첫 시작하고 초기 상태를 설정 알려줍니다, 그 어떤 이유가 불완전 상태 머신 보고서, 상태가 I 전에 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