弹簧状态机转换



我试图触发其他转换以自动状态机(SM(但它不起作用:初始操作(findCustomer(((应该改变SM的初始状态,然后每个操作触发一个事件,依此类推到最终状态。这是我的配置:

    @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);
        };
    }
}

您有事件CardEvents.FIND_CUSTOMERCardStates.ACTIVE_STATUS CardStates.CUSTOMER_FOUND。从findCustomer()发送的事件CardEvents.CUSTOMER_FOUND不同于CardEvents.FIND_CUSTOMER

改变这一点,我认为它应该有效。我想,就我个人而言,我更愿意通过匿名转换和选择状态来驱动机器automatic

最新更新