建议工作流系统的持久策略

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

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

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

我需要有关如何理解定义的建议。

  1. 我应该使用rdbms表吗? 如果是这样,我是否可以借用与业务流程概念相近的数据库模式?

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

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

通过“编排”,我假设你的意思是有限状态机 。 当前状态决定了可以跟随其他状态的转换。 状态和转换作为边和顶点的表示通常会生成有向无环图 ,但有时图会循环(例如草稿 – 提交审批 – >待批准 – 拒绝 – >草稿)。

实际上,将定义与执行分离,需要一种可以轻松适应自定义的持久性格式。 随着系统的发展,您会发现许多意料之外的边缘情况,其解决方案不应要求更改持久性模式,只需更改代码。 这意味着XML或NoSQL解决方案 – 其架构很容易改变或不存在。

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

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

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

我不会使用rdbms表,或者如果你这样做,将定义存储为文本blob。 尝试为定义制作记录是一个坏主意,因为它更加不灵活,很难随着时间的推移改变您的定义。 很多人会使用不同的方法,但我会使用JSON或YAML,并避免使用XML。 其动机是尽可能简化。 尝试使用XML,特别是XML的forms化特定格式,将使您花费更多时间来满足实际上没有做任何事情的确切规范来帮助您完成任务。 从代码的角度来看,JSON和YAML都非常容易使用。 YAML更容易被人类阅读并且更容易编辑,并且对于标点符号和JSON的转义并不那么棘手。 JSON使用得更广泛,并且比YAML小。 如果文档大小是一个问题,JSON也有一个二进制对应的BSON。

一旦你有一个导入器/导出器进出内部对象到你的数据格式,那么继续使用RDBMS或其他机制将是直截了当的。 您甚至可以使用CouchDB,它可以为您的应用程序提供其他好处,可能非常适合。

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

  1. RDBMS :如果你这样做,你将能够查询工作流实例,例如哪些令牌位于’节点X’?
  2. XML存储为clob:简单性就是这个解决方案的真实性,但你无法真正查询这些只是通过id获取它们
  3. NOSQL :针对不同的问题有很多不同的解决方案。 MongoDB是一种流行的解决方案,它提供面向文档的持久性。

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