弹簧状态机无效转换

时间:2018-11-20 21:25:21

标签: spring state-machine spring-statemachine

我刚刚开始尝试Spring状态机库。我有一个正在尝试建模的简单状态机,但是当我提供的事件对于该机器当前处于无效状态时,我希望得到通知。

例如,如果我的状态机仅在接收到事件X时才允许从A转换为B,那么我希望在状态为A但收到事件Y时得到通知,因为这是一个错误。

我知道可以通过为所有可能的负状态设置过渡并在那里进行处理来实现这一点,但理想情况下,将有某种方式仅允许我明确定义的过渡并在发生任何其他情况时提醒我。这可能吗?

2 个答案:

答案 0 :(得分:0)

状态机上的sendEvent方法返回一个布尔值,表示转换是否成功。

boolean accepted = stateMachine.sendEvent("event");

在这种情况下,“接受”会告诉您转换是否成功。如果布尔值返回true表示转换发生,如果布尔值返回false表示转换无效且未执行任何操作。

答案 1 :(得分:0)

您可以使用状态机侦听器捕获未接受的事件:

...    

@Override
public void configure(
    StateMachineConfigurationConfigurer
                            <States, Events> config) throws Exception {

    config.withConfiguration()
          .listener(listener()) 
          .autoStartup(true);
}

...

private StateMachineListener<States, Events> listener() {
        return new StateMachineListenerAdapter<States, Events>(){

                @Override
                public void eventNotAccepted(Message<Events> event) { 
                        log.error("event not accepted: {}", event);
                }
        };
}
相关问题