【问题标题】:Spring State Machine TransitionsSpring 状态机转换
【发布时间】:2017-05-15 13:33:42
【问题描述】:

我试图触发其他状态机的转换以生成自动状态机 (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);
        };
    }
}

【问题讨论】:

  • 出了什么问题?请提供minimal, complete and verifiable example
  • 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() 操作,因为它在其转换中定义。

标签: java spring state-machine spring-statemachine


【解决方案1】:

您有CardEvents.FIND_CUSTOMER 的事件CardStates.ACTIVE_STATUSCardStates.CUSTOMER_FOUND。从findCustomer() 你发送的事件CardEvents.CUSTOMER_FOUNDCardEvents.FIND_CUSTOMER 不同。

改变它,我认为它应该可以工作。想一想,我个人更喜欢通过匿名转换和选择状态来驱动 automatic 机器。

【讨论】:

    猜你喜欢
    • 2023-03-27
    • 2019-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多