1

我正在为我的宠物项目创建一个 UI 配置工具。这个工具的一个方面让最终用户定义他的编排。然后我需要将此编排定义保存到数据库中。在运行的系统中将有这个定义的可执行版本。可执行版本是按需动态创建的。

想法是将DEFINITIONEXECUTABLE版本分开,以便我可以灵活地在 BPMN 或 JPDL 或基于 POJO 的工作流解决方案 (BeanFlow) 中选择运行时版本。

限制:我不能使用 jBPM、Activiti 等框架附带的 BPMN 编辑器,因为我不想使用自己的特定于我的域的 UI。

我需要关于如何坚持定义的建议。

  1. 我应该使用 rdbms 表吗?如果是这样,我可以借用一个接近编排概念的数据库模式吗?

  2. 我应该将我的定义序列化为 BPMN/JPDL XML 实例文档吗?

  3. 还有其他我可以使用的简单格式吗?

4

4 回答 4

2

通过“编排”,我假设您的意思是有限状态机。当前状态指示可以遵循哪些转换到其他状态。将状态和转换表示为边和顶点通常会产生有向无环图,但是有时该图会循环(例如草稿-提交以供批准->待批准-拒绝->草稿)。

在实践中,将定义与执行分开需要一种可以轻松适应定制的持久性格式。随着系统的发展,您会发现许多未预料到的边缘情况,其解决方案不需要更改持久性架构,只需更改代码即可。这意味着 XML 或 NoSQL 解决方案 - 其架构很容易更改或不存在的东西。

现在,为此目的编写了我自己的 XML 定义(出于无趣的原因,我将排除),我的建议是使用 JPDL(或 BPMN)。原因是它们的定义可能包含您现在正在考虑的任何内容,将来会考虑并启用自定义 - 例如在给定点挂起任意数据或行为。您还可以获得已经构建的工具(不仅仅是 UI)的优势,例如用于处理周期检测并确保有一条完成路径。

我知道 JPDL 拥有的一些有趣功能是帮助合并分叉进程、定时任务(包括那些定期重复的任务)和发送通知的工具的能力。最后一项 - 通知 - 有一些进一步的说明。我在自己的系统中发现的一件事是需要发送可配置的电子邮件,其内容基于流经的数据。这些现有的引擎通过提供一种将变量插入到文本中的方法,然后在传输之前在运行时动态评估,从而使这变得相对容易。它们还提供了引擎和任何用户存储之间的桥梁,目的是向人群发送通知,为他们分配任务并执行安全策略。

最后,根据您系统的范围,您可能仍会使用数据库。我的建议是以序列化格式存储 XML 和编排到数据库中的数据。然后,如果数据在执行过程中被更改,则将数据的序列化——如果它也被更改,可能还有工作流程——也写到历史/审计日志表中。

于 2011-01-27T17:00:46.643 回答
1

非常好的问题!这是我的两分钱:

  1. RDBMS:如果您这样做,您将能够查询工作流实例,例如哪些令牌位于“节点 X”?
  2. 将XML存储为 clob:简单性是此解决方案的真相,但您不能真正查询这些,只需通过 id 获取它们
  3. NOSQL:针对不同的问题有很多不同的解决方案。MongoDB是一种流行的解决方案,它提供了面向文档的持久性。
于 2011-01-26T07:19:59.593 回答
1

我不会使用 rdbms 表,或者如果你这样做,将定义存储为文本 blob。尝试为定义记录是一个坏主意,因为随着时间的推移更改定义变得更加不灵活和困难。许多人会使用不同的方法,但我会使用 JSON 或 YAML,并避免使用 XML。这样做的动机是使其尽可能简单。尝试使用 XML,尤其是正式的特定格式的 XML,将使您花费更多的时间来满足一个确切的规范,而该规范实际上并不能帮助您完成您想要完成的工作。从代码的角度来看,JSON 和 YAML 都非常容易使用。YAML 更易于人类阅读和编辑,并且不像 JSON 那样在标点符号和转义方面很棘手。JSON 使用更广泛,并且比 YAML 更小。

一旦你有一个导入器/导出器来/从你的内部对象到你的数据格式,那么使用 RDBMS 或其他机制进行持久化将很简单。您甚至可以使用 CouchDB,它可以为您的应用程序提供其他好处,并且可能非常适合。

于 2011-01-26T07:22:25.543 回答
0

如何使用例如XStream对组合 UI 进行简单序列化,然后将序列化的位作为二进制列存储到数据库中。然后当用户登录时,获取相关数据,反序列化,如果需要初始化并显示。

于 2011-01-26T08:09:08.823 回答