【发布时间】: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