问题标签 [spring-statemachine]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
757 浏览

spring - 用于弹簧数据的 Spring Statemachine 持久化器

我们目前正在研究弹簧状态机,我们对带有池和使用存储库的上下文切换的事件服务示例有非常相似的需求,唯一的问题是 redis 仅适用于 linux(用于生产),我们不能依赖它......是否有一种开箱即用的干净方法来使用 Spring Data 集成持久性,或者我是否必须为 StateMachinePersister 编写自己的实现。

https://github.com/spring-projects/spring-statemachine/tree/master/spring-statemachine-samples/eventservice/src/main/java/demo/eventservice

我应该使用 AbstractStateMachinePersister 还是 StateMachinePersist?

谢谢!

0 投票
1 回答
380 浏览

spring-statemachine - 我们可以在 StateMachineBuilder 中使用 UmlStateMachineModelFactory

我正在使用 StateMachineBuilder 创建状态机,因为我需要以编程方式使用它来配置状态和转换。

但是由于一些需求变化,我的配置几乎是不变的,现在我想使用 eclipse uml 建模,因为我不再需要动态或以编程方式构建状态机。为了避免大的代码返工,我想在 builder 中使用 UmlStateMachineModelFactory ,如下所示。

1)在状态机中是否合法,如果是,我如何为每个状态附加进入操作?

目前使用构建器,我正在使用以下代码为每个状态附加入口操作

stateConfigurer.state("State1", this.state1EntryAction, null);

2)我可以在uml模型中给出入口动作类的名称,以便为每个阶段附加入口动作吗?如果是这样,我怎么能在日食纸莎草纸中做到这一点。

提前致谢!

0 投票
1 回答
1833 浏览

spring-statemachine - 弹簧状态机中的并行执行

我正在尝试使用 Papyrus 从遵循 UML 模型的您构建状态机。每个阶段的 entryAction 都使用 DefaultStateMachineComponentResolver 重新注册,以解析到我的 spring 应用程序中的各个 EntryAction 类。我的要求是

1) 从 CS 阶段执行应该分叉到两个线程,在获得触发事件 SUCCESS 时。

2) 在一个线程中,DE1 和 TE1 应按顺序执行,而在另一个线程中,DE2 和 TE2 应按顺序执行

3) 仅当两个线程都成功执行时才应转换到 END 状态,即从 TE1 转换到由事件 SUCCESS 发出信号的加入状态,从 TE2 转换到由事件 SUCCESS 发出信号的加入状态

4)即。成功执行 2 个线程后应转换到 END 状态。

5) 在执行每个阶段时,如果任何任务失败(任务写在 EntryAction 类中),状态机应该导航到 END 状态,使用的信号是 FAILURE、TERMINATED(基于发生错误的严重性)

这是我用来构建状态机并触发执行的代码

我遇到的问题

1) 在使用 taskExecutor 时,状态机执行没有开始。

2)在注释掉taskExecutor之后,触发了exectuion,在控制台中我从entryAction类中获取了日志。

3)在每个条目操作类中,我刚刚添加了以下代码以转换到下一个状态,并用于记录目的

4)但问题是在分析日志后从未进入状态TE1。我的要求是在执行 TE1EntryAction 和 TE2EntryAction 中的任务后进入 END 状态

请在日志下方找到

我创建的 UML 模型中是否存在问题。如果是这样,状态图应该是什么样子

非常感谢您的帮助。

在此处输入图像描述

0 投票
2 回答
1329 浏览

spring-statemachine - 从 PersistHandlerConfig 使用 StateMachineFactory

我们正在使用 PersistHandlerConfig (Persist recipe) 使用 SSM 进行 POC。看起来不错,但出现了一些其他问题。

由于它需要是一个多用户 webapp,每个用户只有一个实例,我们试图遵循 StateMachineFactory 的建议并更改代码,但 Persistence 的配方看起来还没有准备好处理这种情况。

有一种方法可以在 PersistHandlerConfig 中获取所需的 statetemachine(从它的 sm id)?

0 投票
0 回答
947 浏览

spring-statemachine - Spring Statemachine 上下文变量未在操作中更新

我在使用 Spring statemachine + Spring boot 应用程序时遇到了一些问题。

我正在使用 Redis 进行持久化,就像在事件服务演示中一样。我有一个在状态机进入状态“验证”时执行的操作。在其中,我修改了扩展状态变量。下面的代码示例经过简化,但经过测试:

这是主要的调用方法:

这是动作:

当我离开操作时,在 feedMachine extendedState.getVariables 中不包含警卫和错误变量。

这是输出:

任何帮助,将不胜感激。我不确定这是否与 Spring 状态机或 Spring bean 或其他东西有关。我为原始代码道歉(使用 println 而不是 log.debug 等)。

编辑:

我终于发现问题出在哪里了。我在行动中使用context.getExtendedState().getVariables().put("guard", valid);而不是context.getStateMachine().getExtendedState().getVariables().put("guard", valid);. 现在它按预期工作。问题是这两个变量列表不一样。

  • context.getExtendedState()的变量列表将更新为“守卫”
  • context.getStateMachine().getExtendedState()的变量列表不会得到更新。

但是,在创建了最小的工作示例(只有 3 个状态而不是 15+,没有嵌套状态)之后,它与context.getExtendedState().getVariables().put("guard", valid);. 几天前我还检查了context.getExtendedState()context.getStateMachine().getExtendedState()是否相同,我得出的结论是它们是相同的。

在我看来,这似乎是一个错误。

0 投票
1 回答
494 浏览

java - 来自分层弹簧状态机的间歇性“IllegalArgumentException:必须设置源”

我正在尝试使用 spring-statemachine 构建分层状态机。它应该有两个正交状态,每个状态代表两个服务的状态。为简单起见,以下代码减少了状态数,但仍会发生相同的错误。

首先,我在配置中做错了吗?

我得到的错误如下

我调试了应用程序,发现在 spring-statemachine-core AbstractStateMachineFactory buildMachine() 中,stateMap 缺少 CB 和 BUFF 状态之一。最奇怪的部分是哪个接缝是随机的,有时它实际上包含整个集合,我也不例外。

我尝试删除内部转换并调试代码,发现即使 stateMap 是不完整的(如果我从丢失的状态转换它会失败),实例化后的状态机看起来完全符合我的要求,所有那里说。

有任何想法吗?

示例项目https://www.dropbox.com/s/qlarppnma0dq9ai/statemachineerror.tar.gz?dl=0

0 投票
3 回答
605 浏览

spring-statemachine - Spring Statemachine 是有状态的?

我倾向于 ssm,blow 是我的演示配置:

我将两个事件发送到机器,但它运行一次。

ssm 有状态吗,我怎样才能让它无状态运行?

我只想用它来定义我的业务流程。

0 投票
1 回答
500 浏览

spring-statemachine - 如何在状态机中更改目标状态

首先,我不太确定我的案例是否适合使用弹簧状态机。

这是我的情况:

我有一个大的可变对象和一组逻辑单元,它们将以一定的顺序操纵这个可变对象。

对于正常流程: A.exec -> B.exec -> C.exec -> Done

对于从 A 抛出异常的不良流程:A -> 错误 -> 完成(绕过 B 和 C)

对于从 B 抛出异常的错误流:A -> B -> 另一个流

我猜 A、B、C 可以建模为一个状态,而从 A 到 B 的转换可以使用一个动作来执行真正的商业逻辑。

如何从 A 捕获可能抛出的异常并将目标更改为另一个状态而不是 B?

谢谢

莱昂

0 投票
1 回答
436 浏览

spring-statemachine - 如何确定当前状态的有效事件列表

在 UI 中表示状态机时,了解当前状态的有效事件列表以禁用/隐藏无效选项将很有用。我不想复制所有状态机规则。

0 投票
1 回答
139 浏览

spring - StateMachineInterceptor 触发瞬态

我有一个从 A -> X_choice 的转换,并且 X_choice 将转到 B 或 C。我想要一个拦截器,以便我可以记录从 A -> B || 的转换 C. 当我尝试挂钩任何可能的事件(preStateChanged 等)时,我只能得到从 A -> X_choice 的转换。从 X_choice -> B 或 X_choice 开始时不会触发回调。我有什么办法可以轻松做到这一点?

我有一个 StateMachinerInteceptor 定义如下:

我想要的是这样的:

或者两个回调,一个来自 A -> X_choice,一个来自 X_choice -> B。这可行吗?我需要这个,因为我正在使用 Persist 配方,并且坚持实际上是坚持选择状态而不是实际的终端状态。