一文看懂开源工作流引擎 Flowable
2020-05-13按:论文写作于2019年6月1日完成,当时Flowable版本号为V6.4.1。2020年3月,Flowable发布V6.5.1版本。Flowable官方网站进行了flowable.org与flowable.com的域名管理,原官方文档新地址为https://flowable.com/open-source/docs/。
本文原发于个人博客、个人微信公众号、语雀、Medium等平台,授权遵循CC BY-NC-ND标准许可。
一、工作流引擎使用场景
工作流在企业管理系统中是高频使用的功能,一个最常见的例子就是请假加班申请与流程图的流程。事实上,工作流引擎能支持的业务场景不止单据梯,几乎都涉及到业务流工作转、多个流程完成的背后场景都可以通过工作流支撑。基于工作流引擎,可以搭建作为客户关系管理系统(CRM)、运输管理系统(TMS)、流量引擎、财务管理系统(WMS)、费用系统等多种复杂业务系统。对于达到一定规模的企业,良好的BPM(业务流程管理,Business Process Management)体系可以支持创建公司内部不同部门的复杂业务流程,既提高工作效率、又可推动企业规范化发展。
按 Enter 键或单击即可查看完整尺寸的图像
图1 业务流转地图(图片来源:www.flowable.com)
二、可流动是什么
Flowable 是一个使用 Java 编写的轻量级业务流程引擎,使用 Apache V2 许可协议开源。2016 年 10 月,Activiti 工作流引擎的主要开发者离开 Alfresco 公司并在 Activiti 分支基础上开启了 Flowable 开源项目。基于 Activiti v6 beta4 发布的第一个 Flowable 版本为 6.0。以 JAR 形式发布使得 Flowable 可以轻松加入任何 Java 环境:Java SE、Tomcat、Jetty或 Spring 之类的 servlet 容器;JBoss 或 WebSphere 之类的 Java EE 服务器等等。 另外,也可以使用 Flowable REST API 进行 HTTP 调用。
Flowable项目中包括BPMN(业务流程模型和表示法)引擎、CMMN(案例管理模型和表示法)引擎、DMN(决策模型和表示法)引擎、表单引擎(表单关系引擎)等模块。也有许多Flowable应用(Flowable Modeler、Flowable Admin、Flowable IDM 和 Flowable Task),并提供了直接可用的UI示例。模块之间的协作可以参考下图:符号)引擎、CMMN(案例管理模型和表示法)引擎、DMN(决策模型和表示法)引擎、表单引擎(表单引擎)等模块。也有许多Flowable应用(Flowable Modeler、Flowable Admin、Flowable IDM 和 Flowable Task),并提供了直接可用的UI示例。模块之间的协作可以参考下图:
按 Enter 键或单击即可查看完整尺寸的图像
图2 Flowable架构示意图(图片来源:www.shareniu.com )
构建OA、CRM、TMS、财务管理等系统时,如果基于Flowable生态做定制化开发,可以大大减少开发成本,避免编写复杂而难以维护的条件代码。Flowable的关键是核心引擎,核心引擎是一组服务的集合,并提供管理与执行业务流程的API。生态系统中的业务流程引擎(BPMN)可以与决策引擎(DMN)、案例模型引擎(CMMN)、表单引擎联动,开发者可以根据业务需求选用其中一个或多个模块,通过模块之间相互协作构建业务系统、以实现强大的功能。Flowable团队在开源项目之外也承接商业项目,提供Flowable Work、Flowable Engage等商业产品与服务,www.flowable.com网站上提供了该团队为银行和保险业实施过的成功案例,展示了Flowable对复杂场景的业务支撑能力。下面简要介绍Flowable中的几个主要引擎模块。
三、Flowable BPMN 业务流程引擎
流程引擎是支持配置业务流转流程的关键模块。Flowable支持BPMN 2.0行业标准,同时提供了一些Flowable自定义的BPMN扩展(extensions)可选用,允许通过导入XML文件或者通过前端可视化界面建立流程。Flowable本身提供了一个较差的UI界面(Flowable Modeler App),如下图所示:
按 Enter 键或单击即可查看完整尺寸的图像
图3 Flowable Modeler应用中的流程异构界面
Flowable 业务流程引擎支持以下类型的流程元素:
事件:事件(event)通常用于为生命周期中发生的事件建模。在 BPMN 2.0 中,主要有两种事件分类:捕获(捕获)与推送(抛出)事件。捕获事件为当流程执行到达此事件时,会等待触发直到动作。触发事件当流程执行到此事件时,会触发一个事件。具体事件包括事件、启动事件、事件结束事件、消息事件、信号、边界事件等丰富类型。
顺序流:顺序流(sequence flow)是流程中两个元素间的连接器。在流程执行过程中,一个元素被访问后,会沿着其所有出口顺序流继续执行。这意味着BPMN 2.0的默认是一个执行的:两个出口顺序流就会创建两个独立的、多个的执行路径。
顺序流上条件定义(条件序列流)时为条件顺序流。当离开 BPMN 2.0 活动时,默认行为是计算其每个出口顺序流上的条件。当条件计算为 true 时,选择该出口顺序流。如果该方法选择了多条顺序流,则生成多个执行,流程会以多种方式继续。但这种情况不适用于网关(网关),不同类型的网关,会用不同的方式处理带有条件的顺序流。所有的BPMN 2.0任务与网关都可以使用默认顺序流(默认顺序流)。只有当没有其他顺序流可以选择时,才会选择默认顺序流活动作为出口顺序流。流程会忽略默认顺序流上的条件。
- 网关:网关(gateway)用于控制执行的流向,可类比路口的分叉来理解。如按BPMN 2.0的用词也即是执行的「标志(token)」。网关可以消费(消费)与生成(生成)标志。网关可细分为以下类型:
排他网关(独占网关):也叫异或网关(XOR网关),或者基于数据的排他网关(基于数据的独占网关),用于对流程中的决策建模。当执行到定义这个网关时,会按照所有出口顺序流的顺序对它们进行计算。选择第一个计算条件为true的顺序流(当没有设置条件时,认为顺序流为true)继续流程。使用排他网关时,只选择一条顺序流。当多条顺序流的条件计算都为true时,会且只会选择在XML中最先定义的顺序流继续流程。
颗粒网关: 颗粒网关不计算条件,如果连接到颗粒网关的顺序流上定义了条件,会直接忽略该条件。 颗粒网关(并行)网关)可以将执行分支(fork)为多条路径,也可以合并(join)多条入口路径的执行,完成网关的功能取决于其入口与出口顺序流。如果网关同时具有多条入口与出口顺序流,同时具有分支与合并的可以。这种情况下,网关首先合并所有入口顺序流,然后分割为多条出口顺序流。
支持网关:可做排他网关与完整条件网关的组合。与排他网关一样,可以在支持网关的出口顺序流上条件,支持网关会计算。但是主要的区别是,支持网关与完整条件网关一样,可以同时选择多于一条出口顺序流。支持网关的聚合行为比看网关更复杂。
基于事件的网关:基于事件的网关(基于事件的网关)提供了根据事件做选择的方式。网关的每一条出口顺序流都需要连接到一个捕获中间事件。一个基于事件的网关,必须有省略或更多的出口顺序流。
4.任务:Flowable支持的任务类型超过十五种。
用户任务:用于对需要人工执行的任务进行建模。当执行流程到达用户任务时,会为指派至该任务的用户或组的任务列表创建一个新任务。用户任务允许符号提示日期以及直接指派给用户。
邮件任务:Flowable引擎可以向一个或多个收信人发送邮件,支持cc、bcc、HTML文本等,使用支持SMTP的外部邮件服务器发送邮件。
业务规则任务:业务规则任务(业务规则任务)用于同步执行一条父母条规则。在 V6.3.0 到 V6.4.1 版本中,Flowable 使用名为 Drools Expert 的 Drools 规则引擎执行业务规则。截止到 V6.4.1 版本,业务规则中包含的 .drl 文件,必须与定义了业务规则服务并执行规则的流程定义一起部署。这意味着流程中使用的所有.drl 文件都需要备份在流程 BAR文件中,与任务表单等类似。由于 Flowable 自己的规则引擎 DMN 功能逐步完善,对业务规则任务的支持可能会在后续版本中进行,具体不然 Flowable 官方更新文档。
其他的任务类型还有脚本任务、Web服务任务、Shell任务、Java服务任务、执行监听器、任务监听器等。
5.子流程与调用活动:子流程(子流程)是包含其他的活动、网关、事件等的活动。其本身构成一个流程,并作为更大流程的一部分。子流程完全在父流程中定义(所以也称嵌入式子流程)。在复杂流程流转的场景下中子流程不多见,利用这一特性比较灵活地包含子流程的中间路径。
调用活动(call Activity)有别于一般的子流程,调用活动引用一个流程定义外部的流程,而子流程嵌入在原有的定义内部。调用活动的主要使用场景是,在多个不同的流程定义中调用一个可重复用的流程定义。
按 Enter 键或单击即可查看完整尺寸的图像
图4 子流程示意图 (图片来源:https://www.flowable.org)
Flowable支持两种方式使用表单:使用(由Flowable提供的表单设计器创建的)表单定义的内置表单渲染,以及外部表单渲染。内置表单设计器的详细内容可以查看相应的表单引擎(Form Engine)用户手册。
Flowable以事务的方式执行流程,可按照需求进行配置。如果Flowable被触发(启动流程,完成任务,为执行发送信号),Flowable将沿执行流程,直到到达每个执行路径的等待状态。更具体地说,它以深度优先方式搜索流程图,并在每个执行路径都到达等待状态时返回。等待状态为「之后」再执行的任务,之后着着Flowable当前执行持久化,并等待触发。再次触发可以来自外部来源如用户任务或来自来自消息接受任务,也可以可流动的自身如计时器事件。
Flowable自带身份管理模块,但是从Flowable V6起身份管理(IDM IDentity Management)组件从Flowable引擎模块中抽出,把其逻辑移至不同的模块。默认情况下,IDM引擎在Flowable引擎启动时初始化并启动。Flowable提供的几个web应用中就包括Flowable IDM(身份管理应用),为所有Flowable UI应用提供单点登录认证功能,并且为拥有IDM管理员权限的用户提供了管理用户、组与权限的功能。其他Web应用还有:
Flowable Modeler:让建模权限的用户可以创建具有流程、表单、选择表和应用定义的模型。
Flowable Task:运行时任务应用。提供了启动流程实例、编辑任务表单、完成任务,以及查询流程实例与任务的功能。
Flowable Admin:管理应用。让具有管理员权限的用户可以查询BPMN、DMN、Form及Content引擎,并提供了许多选项用于修改流程实例、任务、作业等。管理应用通过REST API连接至引擎,并与Flowable Task应用及Flowable REST应用一起部署。
所有其他的应用都需要 Flowable IDM 提供认证。每个应用的 WAR 文件可以部署在相同的 servlet 容器(如 Apache Tomcat)中,也可以部署在不同的容器中。由于每个应用使用相同的 cookie 进行认证,因此应用需要运行在相同的域名下。
四、Flowable DMN决策引擎
作为以 BPMN 为核心的工作流引擎,Flowable 到底与规则引擎的关联性并不强,但实际业务流程中,有时需要由多个决策来决定走向流程,而每个决策都要根据自身的规则来决定,每个决策之间也可能存在关联。此时就需要规则引擎来提供决策支撑。在规则引擎开源产品中,Drools 是最知名的一款,它实现了 PMML(Predictive Model Markup Language)规范,同时支持 DMN(Decision Model and Flowable目前实现了DMN V1.1规范的框架,由于DMN规范中要求对PMML提供兼容性,这意味着Flowable具有相对强大的业务规则的处理能力。
在您的收件箱中获取He Zhang的故事
免费加入 Medium 以获取该作者的最新消息。
输入您的电子邮件
订阅
在Flowable Modeler应用中DMN引擎表示为「决策表」菜单,通过可以界面进行输入与输出的配置,可导入.dmn扩展名格式的DMN定义。在OMG(Object Management Group)制定的DMN规范中也有相应的XML格式约束。引擎已经插入流程引擎,就可以与其他流程相关资源一起,将DMN定义的压缩进流程文档(BAR)文件中。引擎部署服务将DMN资源部署到DMN引擎。
按 Enter 键或单击即可查看完整尺寸的图像
图5 决策表配置界面 (图片来源:https://www.flowable.org)
DMN 由决策(决策)和其他组成的东西,决策由表达式组成。DMN 标准描述了几种表达式的类型,目前在 Flowable DMN 中仅支持决策表(决策表)类型定义的表达式。决策表描述分为输入表达式与输出表达式两个主要区域。在输入表达式中,可以定义变量,用于规则输入项(输入项)的表达式。通过选择添加输入(添加输入),定义输入表达式。在输出表达式中,可以定义选择表执行结果要创建的变量(变量的值将用于输出项表达式,在下面解释)。可以通过选择添加输出(添加输出),定义多个输出表达式。
在决策表编辑界面,可以选择命中策略,共有四类(单命中、多命中)七种命中策略任选:
(1)单命中、第一命中(single hit & FIRST):多个规则允许交叉,执行从上到下的第一条命中项。
(2)单命中、唯一命中(single hit & UNIQUE):多个规则不允许交叉,执行从上到下的第一条唯一命中项。
(3)单命中、任一命中(single hit & ANY):规则允许交叉,但输出所有的优先级相同,随机执行一条命中项。
(4)单命中、优先级(single hit & PRIORITY):多个命中规则的优先级不同,执行优先级最高的那条。
(5)多命中、输出优先级排序(多次命中&输出顺序):按照输出优先级顺序递减的顺序返回所有命中。
(6)多命中、规则顺序排序(multiple hit & RULE ORDER):按照规则顺序返回所有命中。
(7)多命中、聚合(multiple hit & COLLECT):按照顺序顺序返回所有命中。
DMN 可以被 BPMN 定义的流程调用:在流程中引入一个决策任务(决策任务),并选中引用决策表(决策表参考),来使用新创建的选择表。想深入了解 DMN 特性可参考本文案例说明https://flowable.com/blog/2016/09/decision-model-and-notation-dmn-how-to-start-a-project-2/。
按 Enter 键或单击即可查看完整尺寸的图像
图6 BPMN 中调用DMN 示例(图片来源:https://www.flowable.com)
五、Flowable CMMN案例模型引擎
CMMN 是 Case Management Model 的缩写,在 Flowable Modeler 应用中体现为「案例流程模型」菜单,使用时可以相似引擎可视化配置流程,也可通过XML格式文件。CMMN(Case Management Model and Notation)行业标准 V1.1 版本于2016年发布,目前 Flowable 的 V6.4.1 已支持此标准。
与 BPMN 引擎相比,CMMN 引擎适用于以下几个场景:
(1)重复与任务的工作分配。BPMN引擎在处理顺序执行、职责分工明确的工作流程时有优势,但面对动态、自由、任务的情况时,BPMN架构灵活不足,此时CMMN则更适合应对。
(2)处理带有生命周期特征的场景,如客户、产品、项目、员工。以项目为例,项目的立项、中止、收尾、交付等阶段(phases),可以在CMMN中通过阶段(Stages)概念在更高层次进行描述。
按 Enter 键或单击即可查看完整尺寸的图像
图7 CMMN引擎使用场景示例
每个案例模型都包含一个用于安置计划元素的「计划模型」,每个计划元素都包含一个明确的类型和可配置选项的计划元素定义,常见的计划元素如用户任务(人工任务)、里程碑(里程碑)、流程任务(流程任务)、案例任务(案例任务)和阶段(阶段)。例如下面的计划模型包含三个用户任务计划项和一个里程碑。
按 Enter 键或单击即可查看完整尺寸的图像
图8 CMMN计划模型示意图
Flowable CMMN 引擎支持以下类型的案例元素:
1.阶段(Stage):阶段用于把一组元素聚合在一起,可以有进入和退出的条件。阶段可以打,一个阶段中的计划元素只有其父阶段激活时才生效。
-
任务(Task):任务是发生于引擎外部的事件,包含名称、阻塞(决定任务是否阻塞的布尔值)、阻塞表达式(表达式的布尔值任务决定是否阻塞)等属性。
-
用户任务(Human task):通常是指需要用户通过表单执行的手动任务,包含一系列属性。
-
里程碑(Milestone):里程碑标志某个具体案例到达特定点。
-
案例任务(Case task):案例可以是案例,案例中的子案例就是案例任务。
-
流程任务(Process task):当任务阻塞时,实例化的流程要素会出现激活状态,诉求流程任务完成。
-
条件(Criteria):分为条件和退出条件。
8.决策任务(Decision task):调用DMN引擎中的决策表。
- HTTP任务、脚本任务、Java服务任务、时间监听器等:与BPMN中的相应元素意义相近,不再赘述。
六、Flowable Form 表单引擎
图9 Flowable Form引擎服务示意图(图片来源:www.flowable.org)
Flowable框架中将表单作为一个独立的子模块,可以将表单作为一个服务在其他模块中进行调用,表单服务就可以控制所有流程所使用的表单以及表单字段的自定义、可编写等操作。表单相关的使用可分割表单的定义以及表单的运行实例两个阶段。表单定义支持以.form为后缀的表单定义文件(JSON语言编写)。在Flowable Modeler中应用中,「表单」菜单下可以进行简单的表单拖拽可视化配置定义。flowable.com网站上还提供了一个可视化构建表单案例可以参考https://flowable.com/flowable-forms/。余不赘述。
七、参考资料
-
Flowable 6.4.1 官方文档https://www.flowable.org/documentation.html
-
Flowable商业案例介绍https://flowable.com/casestudies/
3.TKJohn博客https://tkjohn.github.io
4.分享牛博客http://www.shareniu.com
5.IBM BPM解决方案https://www.ibm.com/cloud-computing/cn-zh/products/business-process-management/




