2011-01-26 45 views
1

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

想法是,这样我可以灵活地选择BPMN或JPDL或POJO基于工作流解决方案(BeanFlow)之间运行时版本DEFINITIONEXECUTABLE版本分离。

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

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

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

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

  3. 有没有其他简单的格式可以使用?

回答

2

通过“orchestration”我假设你的意思是finite state machine。当前状态决定了其他国家可以遵循的转换。状态和转换表示为边和顶点通常产生一个directed acyclic graph,但有时图表将循环(例如,草稿 - 提交批准 - >待批准 - 拒绝 - >草稿)。

实际上,将定义与执行分离需要一个可以轻松适应定制的持久性格式。随着系统的发展,您会发现一些意想不到的边缘案例,其解决方案不应该要求更改持久性架构,而只需修改代码。这意味着XML或NoSQL解决方案 - 其模式很容易被更改或不存在的东西。

现在,为了这个目的我写了自己的XML定义(为了不起眼的原因,我将排除),我的建议是使用JPDL(或BPMN)。理由是,他们的定义可能包含您现在正在考虑的任何事情,未来将会实现,并支持定制 - 例如在给定时刻悬挂任意数据或行为。您还可以获得已经构建的工具(不仅仅是UI)的优势,例如用于处理周期检测并确保完成路径。

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

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

+0

+1你刚刚确认了我已经做出的决定,即使用BPMN 2.0作为序列化格式。你可以让我知道你是否创建了自己的用于编排歌曲的用户界面或使用过Oryx。我需要一个可嵌入的业务流程用户界面。我希望它是可嵌入的,因为我想用特定领域的任务和主题对其进行定制 – 2011-01-27 17:30:17

1

很好的问题!这里是我的两分钱:

  1. RDBMS:如果你这样做,你将能够查询工作流实例,例如哪些记号是在“节点X”?
  2. 存储XML为CLOB:简单是该解决方案的真相,但你真的不能查询这些只是ID
  3. NOSQL让他们:有很多不同的问题,不同的解决方案。 MongoDB是一个流行的解决方案,它提供了面向文档的持久性。
1

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

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

0

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