问题标签 [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 投票
0 回答
1134 浏览

java - Spring Statemachine Factory - 留在记忆中

我在相当复杂的场景中使用了 Spring 状态机。我将用 SM 中最简单的部分来解释我的问题。参考下图。这是我的主要状态机 红色标记的主状态机和拾取的子机

红圈中的状态指向下面的子机 冲锋枪

所以,如你所见,我有 3 个动作。sendBasicTemplate、timeoutLogAction 和 processBasicTemplateReply。我将在下面提供相关的代码段和我的配置。

我在这个过程中观察到的是工厂创建的状态机总是驻留在内存中。有一些我想不出的参考。是SM没有停止还是我做错了什么?这是我的代码。

配置类

方法: 1. 这就是我的事件被提供给机器的方式以及新的 SM 实例被创建的地方。我从队列中取出我的事件

行动

那么基于上述,我是否遗漏了什么,以便创建的状态机不会被垃圾收集?或任何其他解释为什么每个请求都会消耗内存并且它永远不会被释放?

0 投票
1 回答
116 浏览

java - 关于源自任何状态的转换的状态机建模查询

我对状态机建模有疑问。我的状态机如下所示:States: a,b,c,d,e Transitions/events: E1,E2,E3,E4,E5 a--E1-->b--- E2-->c--E5-->e

某些转换 E3 和 E4 可以从任何状态(即 b 和 c)发生并终止状态机,即将状态机移动到终端状态

在这种情况下如何对转换 E3 和 E4 建模?我正在使用 Spring 状态机进行实现。如何使用 Spring 状态机对这些转换进行建模?

0 投票
1 回答
589 浏览

spring-statemachine - spring状态机的内存消耗

我曾经用spring状态机开发过一个游戏,在高峰期,它会创建大约5000个状态机,每个状态机大约有25个状态。但是从性能测试中,我们注意到创建了很多对象,这会消耗内存并降低 gc 性能。对于我的选择,有一些对象是不可变的,比如 ObjectState,它可以被所有状态机重用。但它是为每个人创建的。

这是弹簧状态机的性能问题吗?还是我的误用?

0 投票
1 回答
558 浏览

spring-statemachine - 弹簧状态机卡在连接状态

我正在尝试为收款机建模。

我的 StateMachine 配置如下。我省略了一些不重要的状态和事件。

我还为调试目的配置了一个侦听器。

问题是在ACCEPTING_CASH_JOIN加入时,当达到BNR_CASH_IN_EXITCNR_CASH_IN_EXIT 2 个状态时,应该处于哪个状态机。但是在日志中,状态机没有达到它。

最后一行是我通过调用statemachine stateMachine.getState().getIds()上的方法来检查当前状态的方式

0 投票
1 回答
288 浏览

spring-statemachine - resetStateMachine 不清除它的 id

我正在使用StateMachine实例的池列表(目前仅限于一个)并且正在切换statemachine正在使用的上下文 - 但是永远不会更新,当我尝试坚持时StateMachine ID,我最终会覆盖我在数据库中的内容。statemachine有关以下内容以及问题的更多信息。

我的问题是为什么在使用空上下文(即尝试创建新上下文)调用resetStateMachine(in AbstractStateMachine.java) 时,这不会清除机器的当前 id(我理解为什么UUID会保留 - 这是机器独有的)但 id 与上下文也是,不是吗?如果上下文不为空,它会尝试从stateMachineContext

相关来源的摘录:

如果上下文为空:

如果上下文不为空:

当我稍后调用 persist.restore 来拉回状态机上下文时,这意味着我有一个旧的 id 并最终覆盖而不是使用新的 id 来持久化。

这是使用当前发布的版本 1.2.5.RELEASE

0 投票
1 回答
821 浏览

java - buildBeanDefinition 使用 Spring Statemachine 框架失败

我正在尝试在我的项目中使用 Spring Statemachine 框架,但是在编译时遇到了构建 bean 定义错误。

我正在跟随 我的 Spring MVC 应用程序中的第 7 步。我没有使用 SpringBoot,但我认为我没有丢失任何子文件。

这是我的 StateMachineConfig 文件代码:

这是我试图在其中使用 StateMachine 的控制器(注意:我删除了 stateMachine 实例化上方的 @Autowired 标记,因为 intelliJ 一直在说“没有找到 'StateMachine' 类型的豆”。这可能是我的罪魁祸首问题?):

0 投票
1 回答
1152 浏览

java - 弹簧状态机 - 管理长时间运行的进程

我需要一些关于将弹簧状态机用于长时间运行的进程的建议。我想设计一些流程。假设我有下一个状态:Start->step1->step2->step3->finish。我有一个控制器,可以将事件发送到状态机以管理状态之间的转换。我有一个 StateMachinePersister。我有一个从 StateMachineContext 到 byte[] 并返回的转换器。听起来很适合我的业务目标。所以一切都应该正常工作。

但是我有问题吗?当我决定更改流程时,我无法理解如何管理案例。我的意思是,如果我有一个生产环境,其中一些进程持续处于“step2”状态。但我被迫改变流程。假设我想在流程中添加一个步骤或删除一个步骤。我想我在状态机反序列化过程中会遇到问题。

所以问题是:可能是弹簧状态机不适合我,或者有一些食谱我可以如何管理这种情况?


我有一个实体,我想管理状态、转换等。

我有 StateMachinePersist bean,它负责为特定进程初始化 stateMachineContext。

@Bean public StateMachinePersist> persist() { return new StateMachinePersist>() {

}

我有负责持久化和恢复状态机的 StateMachineAdapter

我有负责 StateMachineContext 的序列化/反序列化的 StateMachineContextConverter。我已使用 Kryo 进行此操作。

我有负责切换状态的控制器

0 投票
1 回答
65 浏览

java - 在缺少转换的情况下,弹簧状态机如何向调用者传达错误?

每个对话(每个交易查询)我都有一个状态机实例。交易查询会在接收事件时通过不同的状态移动,并且某些统计数据可能无效。

示例->状态:a、b、c、d、e 转换/事件:E1、E2、E3、E4、E5 状态机类似于:a--E1-->b---E2-->c --E5--> e

我在 builder 中注册了 statemachine listener:StateMachine machine = builder.build(); machine.addStateListener(new StateMachineListener());

此 StateMachineListener 仅抛出 RuntimeException 以防万一事件未被接受,但由于 CompositeStateMachineListener.eventNotAccepted 处的代码未将 execption 传递给调用者而是打印在日志中。

我的问题是:如果事件不被接受,状态机如何通知调用者?

0 投票
1 回答
91 浏览

spring-statemachine - 状态机类转换异常

你好,关于 Spring 状态机。:) 我有一个场景,我必须将一个对象存储在状态机的扩展状态中,然后稍后再获取它以进行处理。当请求进入 SM 时,我执行以下操作并将对象置于扩展状态。

然后我将状态机保存在redis中,稍后当我需要这个对象进行处理时,我得到它如下

但我得到一个类转换异常

java.lang.ClassCastException:com.ctf.sims.dto.xboss.SIMAccountInfo 无法转换为 com.ctf.sims.dto.xboss.SIMAccountInfo

你能猜到为什么会这样吗?

0 投票
1 回答
1628 浏览

spring - 弹簧状态机复位

我有一个关于重置状态机的问题。配置

我有用于持久/恢复状态机的 api。在恢复期间,我将状态机重置为以前的持久状态。

我希望我可以在 jvm 崩溃后重置状态机并从我上次持久的状态继续。例如,最后一个持久状态是 Step2。让我们假设 Step2 的动作是一个长循环。让我们假设在处理这个循环的过程中发生了 Jvm 崩溃。在应用程序启动期间,应用程序识别出有未完成的流程。所以目标是从最后一个持久状态继续。这意味着在将状态机重置为 State2 后,我预计 step2Action 将被触发并且我将继续处理,因为 Step2 尚未完成。不幸的是,在我将状态机重置为 State2 之后,没有调用 step2Action。是否可以针对这种情况触发此操作?