0
다른 상태에서 전환을 트리거하여 자동 상태 기계 (SM)를 만들지 만 작동하지 않습니다. 초기 동작 (findCustomer())은 SM의 초기 상태를 변경 한 다음 각 동작 이벤트를 트리거하고 최종 상태로 진행합니다. 당신은 CardStates.CUSTOMER_FOUND
에 CardStates.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);
};
}
}
무엇이 잘못 되었나요? [최소한의 완전하고 검증 가능한 예] (https://stackoverflow.com/help/mcve)를 제공해주십시오. – Obenland
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() 액션을 호출해야합니다. –