gpt4 book ai didi

java - (UML) Spring-Statemachine 在 statemachine.stop() 之后仍在运行

转载 作者:行者123 更新时间:2023-12-02 11:57:37 27 4
gpt4 key购买 nike

我的 Spring 状态机中有一个守卫。

@Bean
public Guard<String, String> myGuard() {
return context -> {
try {
String x = null;
x.length();
return true;
} catch (Exception e) {
context.getStateMachine().setStateMachineError(e);
context.getStateMachine().stop();
throw e;
}
};
}

这当然是一个java.lang.NullPointerException
因此,在我创建 context.getStateMachine().stop(); 之后,我预计状态机正在停止。

2017-11-24 18:02:55.783  INFO 30652 --- [nio-8080-exec-1] o.s.s.support.LifecycleObjectSupport     : stopped org.springframework.statemachine.support.DefaultStateMachineExecutor@367d6b09

就这样,它停止了。但比所有其他守卫、状态和操作都是事后调用的。

但是当出现错误时,我绝对不希望守卫只是切换到false,我真的想退出机器。

只有一个区域。所以,据我理解,它应该停止。

有什么办法可以解决这个问题吗?或者有什么方法可以在发生这种情况时调用类似“退出事件”的东西?

我很感谢您提供解决此问题的任何想法。

使用:

spring-boot: 1.5.8
spring-statemachine-uml 1.2.6

最佳答案

我不确定在这种情况下,当有人试图阻止机器守卫时会发生什么。老实说,我什至从未尝试过,因为你尝试做的事情毫无意义。回顾一下我最初是如何选择按原样公开上下文来保护的,可以访问机器本身,从而使 stop 方法可见。当机器运行时,我不会尝试停止机器的内部逻辑。我早就该考虑这个了:)

但是话虽如此,守卫实际上只有一个作用,那就是保护转换,并且它应该返回 true 或 false。当调用守卫时,我们确实会处理捕获异常(据我所知,我们将其评估为 false),但从守卫中抛出某些内容通常是未定义的行为。

假设您对操作执行的操作出现错误,那么您应该执行与错误相关的操作。我会创建一个终端状态,设置转换到该终端状态,然后您可以从操作(在 catch 内)发送事件来指示机器进入该状态。通常,这种错误处理不会在单根级别计算机内完成,因为它通常会导致状态爆炸(您需要开始设置从所有状态到错误状态的转换)。这就是为什么子状态通常用于处理正确的错误处理。

但是,如果您更多地开放您的用例以及您想要完成的任务,我可以尝试给出更好的示例。错误处理始终是一个特定的主题,因为它通常需要构建到您的机器设计中。从下面的状态图中可以看到我当前正在使用 spring-cloud-skipper 进行的更复杂的错误处理。这可能超出了您的问题范围,但为您的下一个评论提供了一些背景。

statechart

关于java - (UML) Spring-Statemachine 在 statemachine.stop() 之后仍在运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47477795/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com