当我收到关于我的 API 的请求时,我想执行一系列步骤,每个步骤都是检查或充实。每一步都可能成功或失败。成功时,应执行下一步。失败时,应执行结束步骤,然后流程完成。为此,我考虑了 Spring State Machine,因为它似乎符合要求。
我已经阅读了文档并尝试了一下,但有些事情让我难以理解:
请求和状态机之间是否应该存在一对一的关系,这意味着对于每个请求,我都会创建一个新的状态机实例?或者我应该通过为下一个请求重置机器来以某种方式重用已完成的状态机?
如何清理已完成的状态机?似乎没有办法销毁和清理状态机实例。如果我为每个请求创建 1 个,我实际上已经引入了内存泄漏,除非框架以某种方式处理资源。
最佳答案
您的问题没有绝对正确的答案,所以我只需要在这里发表一些评论。状态机作为一个概念非常松散,它为您提供了如此多不同的做事方式。
- 如果一个接一个地执行步骤,则整个概念与
tasks
配方的实现方式有关。它执行一系列任务,如果父任务失败,机器将进入错误状态,让用户有机会修复问题并请求机器继续。 statemachine-recipes-tasks statemachine-examples-tasks .可能这种用例很适合创建新配方,因为它非常通用。 - 框架应该在机器停止后清除东西,最终 jvm 应该清除垃圾。如果您发现异常,请提交 gh 问题,我们会解决问题。
- 我们有 sample statemachine-examples-eventservice这是重复使用机器,但我目前正在重新实现该示例(它可以工作,但应该更好地实现)正如我们的主厨告诉我的那样,我在那里所做的是转储 SPR-15042 .机器不能与
session
作用域一起使用,如果富对象(ssm 是)被序列化,事情就会变得糟糕。 - 将状态和选择结合起来相对容易,从而完成您的步骤流程。唯一的问题是你有多希望它可以重复使用(因此通用配方会是一件好事,欢迎 PR :) )
- 我在 gh-240 的状态图中展示的错误处理会带来什么?也是需要考虑的事情。
- 有人质疑 ssm 是否可以作为更通用的流引擎工作,但它可能永远不会是这样,因为它将是一个全新的项目。认为大部分流程都可以作为单独的配方处理。
关于java - Spring State Machine - 我应该创建多少个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41374212/