问题标签 [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 回答
2295 浏览

spring - Spring State 机器不接受来自多个用户的相同事件

我有简单的状态机,下面有States,EventsTransitions.

状态:WIP, SUBMITTED, REJECTED, APPROVED

事件:SUBMIT, APPROVE, REJECT

过渡:

  1. 提交事件的 WIP 到 SUBMITTED
  2. 提交给批准事件
  3. 提交到 REJECTED 的 REJECT 事件

我已将WIP初始状态设置为如下:

多个用户将与此状态机交互。当针对源状态和目标状态的组合多次引发相同事件时,状态机仅接受第一个事件,不接受后续事件。

这是状态机的有效行为吗?如果是,我需要添加任何额外的配置吗?

0 投票
1 回答
2401 浏览

jpa - DDD和依赖注入上下文中实体的状态机?

我一直在研究Spring State MachineState 设计模式,因为我必须使用 Spring Boot 开发一个微服务,并且持久化具有许多需要清理的混乱状态的对象,我正在寻找一个干净的设计解决方案混乱。我检查了 DDD、状态概念和状态机,看看要应用哪些

我不确定如何实现一些概念,以及如何连接它们。我想了解是否:

  1. Spring State Machine 可以在转换期间对实体工作,还是只能在全局应用程序状态级别上工作?
  2. 要管理多个实体,每个实体都处于自己的状态,是否必须将其创建为原型范围的组件?
  3. 它是否容易与状态模式集成,还是不应该一起使用?
  4. 为了管理这个,我应该将状态或状态机注入实体(可行,我知道,但我不喜欢使用 @Configurable 和适当的 AspectJ 编织配置的想法)?我分享某人的印象,它可以使它更复杂,也许我不得不使用@Scope("prototype")
  5. 相反,如果有可能让域服务在每个实体的基础上委托状态机(因此另一个域服务)以供单个实体更改状态?或者这是贫血的领域反模式,但如果是这样,状态机与 DDD 的集成效果如何?
  6. 有没有关于 Spring State Machine 如何让我做我想做的事情的例子,它有多轻量级,以及它有多慢和消耗内存?

我明白了:-DDD 想要具有比简单数据对象更多功能的域对象,就像这篇关于 DDD的非常完整但有点过时的文章一样- 状态模式应该封装上下文元素在特定情况下的行为方式 - 状态机是关于封装对一个状态和另一个状态之间的通道的管理 - 如果它们一起工作,状态不应该在特定命令上规定哪个是下一个状态,而是为状态机生成一个事件,状态机将选择(或阻止如果有失败的守卫)新状态 - 状态机必须以某种方式在上下文中设置新状态

通常 Context 对象应该直接委托给 State 对象。但是由于状态机决定了对象状态的变化,在这种情况下,上下文不应该委托给某种代理状态吗?应该将状态机注入实体还是代理?

非常感谢您对其中一些问题的任何想法、建议,甚至部分答案。

顺便说一句,我只是

0 投票
2 回答
2388 浏览

spring - 具有两种状态机配置的 Spring statemachine Persist recipe

我正在尝试将弹簧状态机的 Persist 示例扩展到两种不同的状态机配置。 http://docs.spring.io/spring-statemachine/docs/1.0.0.RELEASE/reference/htmlsingle/#statemachine-examples-persist

为此我

  • 添加了新架构
  • 添加了一些测试数据
  • 复制了 Persist 和 PersistCommand 的代码,并根据我的情况对其进行了调整

到目前为止没什么大不了的。现在到配置:

  • 我删除了 StateMachineConfig(以及 @EnableStateMachine 注释)
  • 将 StateMachineConfiguration 作为 Bean 添加到 PersistHandlerConfig 中并使用 Builder
  • 复制该配置并将其调整为我的用例
  • 显然,我为我的案子上了一个像 Order 这样的课程

此外,我调整了 AbstractStateMachineCommands 类并在其中自动装配状态机列表。start/stop 和 state 方法现在启动/停止和打印每个状态机的状态(这里我不关心打印、变量)。

出现的问题是:

  • 持久化不再起作用
  • 我可以启动应用程序和两个状态机
  • 我可以使用所有 persist 和 myUseCase 调用,但没有处理持久数据。
  • 例如,如果我调用持久化进程 1,应用程序将底层 SM 的状态更改为 PROCESSING,但持久化的数据不会改变。
  • 在调试中,我能够在 LifecycleObjectSupport 中解决 getTaskExecutor 方法返回 null 的问题(而在原始示例中,bean 工厂返回 SyncTaskExecutor 的实例)。
  • 此外,似乎 TestEventListener 不再适用于任何状态机
  • 当我在任何包含状态机 bean 的配置中使用 @EnableStateMachine 时,会在 StateMachineConfiguration 的 afterPropertiesSet 处发生 NPE。

那么,谁能告诉我我在哪里搞砸了?还是 Persist 配方不适用于两个状态机?

非常感谢。

代码示例:Application.java 现在包含这些配置和实体:

TicketPersist.java 和 TicketPersistCommands.java 与订单的相同(只是将订单替换为票证)。我通过以下方式调整了 AbstractStateMachineCommands:

0 投票
1 回答
571 浏览

java - 在@OnTransition 注解的方法中获取StateContext

在 Spring Statemachine 参考文档中是这个示例代码:

StateContext是否可以从带有注释的方法访问对象@OnTransition?也许我不明白注释的正确用法......我认为它可以以与 类似的方式使用Action,我可以访问存储在ExtendedState.

0 投票
1 回答
1465 浏览

event-sourcing - 是否可以将弹簧状态机与事件源模式结合起来?

我的想法是通过弹簧状态机跟踪域对象的状态。即状态机定义如何传输域对象的状态。当事件被持久化/从事件存储中恢复时,可以通过将事件发送到状态机来(重新)生成域对象的状态。

但是,创建状态机对象似乎相对昂贵,每当域对象发生状态转换时,创建状态机对象的性能并不高。如果我只维护一个状态机对象,我会担心并发问题。一种方法是拥有一个“状态机池”,但如果我必须为多个不同的域对象创建状态机,它就会变得混乱。

那么将 spring 状态机与事件源模式一起应用是一个好主意吗?

0 投票
0 回答
2000 浏览

spring - Spring 状态机不会更改某些事件的状态

我刚刚开始研究这个主题。我尝试将 Spring 状态机与 Spring Web MVC 应用程序集成,其中我从控制器发送事件。

我的问题是,机器正在为某些事件过渡,而对于某些事件却不是。我试图打印日志。在那里我可以看到事件通用消息排队但没有发生转换。请帮忙!

我在这里给出我的日志的一部分-

2016-01-06 12:51:32 DEBUG AbstractStateMachine:557 - Queue event GenericMessage [payload=LOGIN_CLICKED, headers={timestamp=1452064892305, id=1e223e37-4eb3-95e4-ec32-8447d57616f5}]

这里 LOGIN_CLICKED 是我的事件,它应该使我的机器从 WAITING_USER_INPUT 状态变为 LOGIN_PAGE 状态。但它没有发生。

以下是所有相关文件:

状态.java

事件.java

StateMachineConfig.java

OnTransitionActions.java

RunStateMachine.java

如上所示,我通过RunStateMachine.java发送事件。我从我的 MVC 控制器调用 fireEvent 方法,如下所示:

登录控制器.java

这是状态机配置文件:

statemachine-config.xml

这是web.xml/Welcome ,我在其中声明了 spring 安全性的自定义过滤器,该过滤器/Login在上面的控制器中过滤并发送所有请求:

更新:解决了!! 刚刚发现多个 MVC 控制器不适用于状态机!!!当我将所有 RequestMapping 方法放在 1 个控制器中时,它就起作用了。

0 投票
1 回答
102 浏览

builder - 使用 StateTransition 对象的 Spring 状态机生成器

我找不到有关此功能的任何参考。我是否应该在构建器中实现一个辅助方法来读取 StateTransition 对象中的字段并自己填充链 configureTransition() 调用?

只是为了确认不要重新发明轮子。

更新:我正在尝试使用 StateMachineBuilder 在属性文件中配置一些预定义的状态和转换。在 Builder 中,他们使用这个链式调用来生成配置:

builder.configureTransitions().withExternal().source(s1)....

我想到的是,从文件中读取的所有内容都存储在一个对象中,spring sm 库有这个 StateTransition 对象。但是据我从API中了解到,没有办法直接使用它来配置状态机。相反,我可以读取对象中的各个字段并使用上面的链式调用。

谢谢!

0 投票
2 回答
1350 浏览

spring - Spring State Machine 任务执行未触发

我在以以下参考中描述的方式运行可运行对象时遇到问题:

http://docs.spring.io/autorepo/docs/spring-statemachine/1.0.0.M3/reference/htmlsingle/#statemachine-examples-tasks

我的实现如下所示:

TaskExecutor 的初始化如下所示:

我的 dp (DataProcessor) 代码如下所示:

当我执行我的代码时,我会毫不拖延地看到“行动中……”和“行动后……”的消息。

当我使用以下内容时:

我得到了我对使用 TasksHandler 的期望..

  • 状态更改为解锁
  • 在线程 2... 睡 10000
  • 在线程 3... 睡 5000
  • 在线程 4... 睡 8000
  • 在线程 5... 睡 4000
  • 在线程 6... 睡 4000
  • 在线程 1... 睡 9000
  • 2016 年 1 月 13 日下午 12:32:13 - org.springframework.scheduling.concurrent.ThreadPoolTask​​Executor 初始化
  • 信息:初始化 ExecutorService
  • 状态更改为 LOCKED
  • 线程 5 之后...
  • 在线程 6 之后...
  • 在线程 3 之后...
  • 线程 4 之后...
  • 在线程 1 之后...
  • 在线程 2 之后...

使用 TasksHandler 时,睡眠延迟之前或之后的消息均不显示。所以我的问题是,我如何实际执行我的可运行文件?如果我做得正确,我应该检查什么?

0 投票
2 回答
2797 浏览

java - 同步运行的 Spring 状态机嵌套机器

我正在使用 Spring 状态机并尝试配置一些嵌套功能。本质上,我试图将两个进程作为嵌套在一个状态中的单个机器运行。我有以下状态和转换代码:

我期待机器分叉在任务状态中标识的两台机器并将它们作为单独的机器运行。T1 和 T2 动作设置为在 Task 中的每个状态都有延迟。T1 延迟 1 秒,T2 延迟半秒。

我发现 T1 贯穿它的所有状态并在 T2 甚至开始之前结束。有什么想法可以让它们通过分叉/连接运行吗?

0 投票
2 回答
996 浏览

spring-statemachine - Spring Statemachine 和 xml 配置

我是 Spring Statemachine 框架的新手。可以在经典 XML 配置文件上使用配置吗?状态、事件和动作会更清晰。