2017-05-15 3 views
0

다른 상태에서 전환을 트리거하여 자동 상태 기계 (SM)를 만들지 만 작동하지 않습니다. 초기 동작 (findCustomer())은 SM의 초기 상태를 변경 한 다음 각 동작 이벤트를 트리거하고 최종 상태로 진행합니다. 당신은 CardStates.CUSTOMER_FOUNDCardStates.ACTIVE_STATUS에 대한 이벤트 CardEvents.FIND_CUSTOMER스프링 상태 머신 전환

@Configuration @EnableStateMachine public class CardStateMachineConfig extends EnumStateMachineConfigurerAdapter<CardStates, CardEvents> { 


    final private static Logger logger = LoggerFactory.getLogger(CardStateMachineConfig.class); 

    @Override 
    public void configure(StateMachineStateConfigurer<CardStates, CardEvents> states) throws Exception { 
     states.withStates().initial(CardStates.ACTIVE_STATUS).state(CardStates.ACTIVE_STATUS, findCustomer(), null) 
       .states(EnumSet.allOf(CardStates.class)); 

    } 

    // @formatter:off 
    @Override 
    public void configure(StateMachineTransitionConfigurer<CardStates, CardEvents> transitions) throws Exception { 




     transitions.withExternal().source(CardStates.ACTIVE_STATUS).target(CardStates.CUSTOMER_FOUND).event(CardEvents.FIND_CUSTOMER).action(findCustomer()) 
       .and().withExternal() 
     .source(CardStates.CUSTOMER_FOUND).target(CardStates.MOBILECARD_FOUND).event(CardEvents.CUSTOMER_FOUND).action(findMobileCard()) 
       .and().withExternal() 
     .source(CardStates.FIND_MOBILECARD_FOUND).target(CardStates.WIRECARD_LOCKED_CARD).event(CardEvents.MOBILE_CARD_FOUND).action(wirecardLockCard()); 


    } 

    // @formatter:on 
    @Override public void configure(StateMachineConfigurationConfigurer<CardStates, CardEvents> config) 
      throws Exception { 
     config.withConfiguration().autoStartup(true).listener(new MobileCardBlockProcessEventHandler()); 
    } 

    @Bean public Action<CardStates, CardEvents> findCustomer() { 

     return (context) -> { 
      context.getStateMachine().sendEvent(CardEvents.CUSTOMER_FOUND); 
     }; 

    } 

    @Bean public Action<CardStates, CardEvents> findMobileCard() { 

     return (context) -> { 
      context.getStateMachine().sendEvent(CardEvents.MOBILE_CARD_FOUND); 
     }; 
    } 
} 
+0

무엇이 잘못 되었나요? [최소한의 완전하고 검증 가능한 예] (https://stackoverflow.com/help/mcve)를 제공해주십시오. – Obenland

+0

1- SM은 초기 상태 인 CardStates.ACTIVE_STATUS로 인스턴스화되지만 findCustomer() 액션은 트리거되지 않습니다. 그래서 아무 일도 일어나지 않습니다 : SM은 진화하지 않습니다. 2 테스트 클래스에서 cardStateMachine.sendEvent (CardEvents.FIND_CUSTOMER)를 사용하여 CardEvents.FIND_CUSTOMER 이벤트를 트리거하면 findCustomer() 액션이 SM 상태 변경이라고하지만 context.getStateMachine(). sendEvent (CardEvents. CUSTOMER_FOUND); 고려되지 않았습니다. 즉, 전환시 정의 된대로 findMobileCard() 액션을 호출해야합니다. –

답변

0

: 여기 내 구성입니다. findCustomer()에서 CardEvents.CUSTOMER_FOUNDCardEvents.FIND_CUSTOMER과 다른 이벤트를 보냅니다.

변경하고 제대로 작동한다고 생각합니다. 개인적으로 익명 전환 및 선택 상태를 통해 automatic 컴퓨터를 운전하는 것이 좋습니다.