java - 这是状态机的用例吗?如果是这样,您建议使用哪个开源软件?

标签 java .net architecture jakarta-ee state-machine

我的应用需要从多个来源提取数据。以下需要用户定义

  1. 数据源的顺序
  2. 在订单中,条件(如果有)确定是使用数据源还是跳过数据源

一旦用户定义了上述两者,应用程序就会为其“编排”分配一个名称,随后他将使用该名称来提取数据。

我想要一些指导

  1. 我是否最好编写自己的代码来处理订单和条件,或者这是一个状态机用例
  2. 如果是状态机用例,那么哪个开源项目提供此支持更好
  3. 状态机有任何规范吗? SCXML?
  4. 状态机的最佳开源实现有哪些?标准(按此顺序):基于标准、易于调试、易于嵌入、正在积极开发、支持状态机的运行时创建

用例:这是一个 Multi-Tenancy 应用程序。每个客户都将设计自己的编排并将其保存到数据库中。我们称之为登机客户。一旦客户登机,他的所有请求都将使用他之前保存的编排。

现在假设有 3 个数据源 A、B 和 C。几乎没有可能的编排

  • Orchestron 1:拉动 A、拉动 B 和 然后将 C 拉入该订单
  • Orchestration 2:拉动 A,如果 A 返回错误,则拉动 B,拉动 B(所以基本上是(A 或 C)和 B)
  • Crchesstrion 3:拉 A、B 和 C。顺序并不重要。全部需要拉动(可能是并行的)

最佳答案

使用状态机的经验法则:

  • 您可以将其绘制为起始图表
  • 流程可能会发生变化,但在给定点(即状态)执行的算法则不然 - 如果算法所做的事情受到状态的影响,那么仍然可以
  • 您希望将更改流程的能力扩展到非程序员

出于您的目的,我会查看 JBoss Business Process Management suite 。您可以使用 XML 表示形式定义和管理状态机,包括允许其他人更改状态机的 GUI 编辑器,然后将其传递给“虚拟机”执行。定义语言提供了许多不同的钩子(Hook),用于自定义代码执行和建模更复杂的行为,例如并行流程、迭代 Activity 和计划事件。

针对评论 #1 进行更新

  1. 更抽象地说,如果你可以将其绘制为方框和线条(UML 符合条件),那么我认为它符合条件。
  2. 鉴于您所描述的用例,我会将每个数据源建模为一个状态 - 为了方便起见,您可以打破这种一对一映射(即每个状态执行多个数据源)。状态之间的转变决定秩序。根据条件限制转换。
  3. 在我看来,另一个用户驱动这是状态机解决方案最引人注目的原因。 SCXML 或 jPDL (jPBM 运行的 XML 定义)实际上是将状态转换序列化为 XML。该 XML 可以在 GUI 中操作 - 两个项目都有基于 Eclipse 的 GUI。这允许数据(即数据源)按照每个用户特定的流程(状态、转换和条件)进行传输。
  4. jPBM 执行引擎是可嵌入的,所以我认为它并不像您怀疑的那么重。 jBPM 的语言 - jPDL - 具有良好的工具支持。我查看了 SCXML,它的功能似乎与 jPDL 大致相同,但文档和成熟度较低。此外,jPBM 允许定义要执行的类作为内联类路径引用,而 SCXML 使用 XML 命名空间的间接寻址。

我会研究并比较 SCXML 和 jPDL 规范。我的印象是 SXCML 是 jPDL 的超集,例如 jPDL 能够重复任务作为其定义的一部分,而 SCXML 则不然。

关于java - 这是状态机的用例吗?如果是这样,您建议使用哪个开源软件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4411990/

相关文章:

c# - 使用 XmlSerializer 将 xml 元素反序列化为数组不起作用

java - 构造复杂的java方法

oracle - 将 Delphi/Oracle 应用程序从 2 层更改为 3 层

c# - 以编程方式将访问控制列表 (ACL) 权限分配给 'this folder, subfolders and files'

java - 按数字顺序显示值

java - 对象可以删除自身吗?如何?

java - 这是将 Java 接口(interface)转换为 Scala 的正确方法吗?

.net - C++/CLI : Catching all (. NET/Win32/CRT) 异常

architecture - "Layers"和 "Tiers"之间有什么区别?

java - while(true) 循环中的 switch 语句,文本出现两次