【问题标题】:Spring state machine invalid transitionsSpring 状态机无效转换
【发布时间】:2019-04-23 09:57:35
【问题描述】:
我刚刚开始尝试使用 Spring 状态机库。我有一个正在尝试建模的简单状态机,但是只要我提供的事件对于机器当前所处的状态来说不是有效的转换,我希望得到通知。
例如,如果我的状态机只允许在我收到事件 X 时从 A 转换到 B,那么我希望在状态为 A 但收到事件 Y 时收到通知,因为这是一个错误。
我知道这可以通过为所有可能的负面状态设置转换并在那里处理它来实现,但理想情况下,有一些方法只允许我明确定义的转换并在发生其他任何事情时提醒我。这可能吗?
【问题讨论】:
标签:
spring
state-machine
spring-statemachine
【解决方案1】:
您可以使用状态机侦听器来捕获未接受的事件:
...
@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);
}
};
}
【解决方案2】:
状态机上的 sendEvent 方法返回一个布尔值,表示转换是否成功。
boolean accepted = stateMachine.sendEvent("event");
在这种情况下,“接受”会告诉您转换是否成功。如果布尔值返回为真,则表示发生了转换,如果返回为假,则表示转换无效且未执行任何操作。