工作流选型

对比

1 工作流简介

1.1 是什么

工作流 (Workflow),就是通过计算机对业务流程自动化执行管理。
是工作流程的计算模型,即将工作流程中的工作如何前后组织在一起的逻辑和规则在计算机中以恰当的模型进行表示并对其实施计算。工作流要解决的主要问题是:为实现某个业务目标,在多个参与者之间,利用计算机,按某种预定规则自动传递
它主要解决的是使在多个参与者之间按照某种预定义的规则自动进行传递文档、信息或任务的过程,从而实现某个预期的业务目标,或者促使此目标的实现, 如常见的审批流程, 总之, 有 "业务流转" 流程化的场景, 都可以使用工作流.

1.2 为什么

复杂繁多的业务流程如果采用 if else 实现那将是崩溃的,代码不可维护,业务流程在代码中可读性很差,所以高人设计了业务流程模型图示 BPMN2.0, 要做到就是把业务场景抽象为标准流程图,把流程图丢到流程引擎中按流程定义约定逐步流转,很显然扩展性和业务可描述性会好很多,
所以工作流引擎主要用于解决复杂的业务,目前经常被提起的中台系统抽象业务为服务,也涉及大量智能的业务流程引擎做支撑。

1.3 BPMN2.0 补充

BPMN2.0(Business Process Model and Notation)是一套业务流程模型与符号建模标准
  精准的执行语义来描述元素的操作
  以 XML 为载体,以符号可视化业务

2 常用工作流引擎

对 BPMN2.0 实现比较好的是 Activiti Flowable 和 jBPM

2.1 activiti

简介
Activiti 是由 jBPM 的创建 Tom Baeyen 离 JBoss 之后建立的项目,构建在开发 jBPM 版本 1 到 4 时积累的多年经验的基础之上,旨在创建下一代的 BPM 解决方案。
 Activity 相对简单,仅有流程引擎,没有表单引擎。在 BPM 的研究领域, 很多的学者,专家都是把流程引擎与表单引擎分开的
流程定义是线下按照 bpmn2.0 标准去描述业务流程,通常使用 activiti-explorer(web 控制台)或 activiti-eclipse-designer 插件对业务流程进行建模,这两种方式都遵循 bpmn2.0 标准。
优势
从技术组成来看,Activiti 最大的优势是采用了 PVM(流程虚拟机),支持除了 BPMN2.0 规范之外的流程格式,与外部服务有良好的集成能力,延续了 jBPM3、jBPM4 良好的社区支持,服务接口清晰,链式 API 更为优雅
Activiti 上手比较快,界面也比较简洁、直观
Activiti 相对丰富的资料,并且高度与 SpringBoot 集成
成熟、稳定、满足 BPMN2.0 规范
用户众多,社区活跃,趋势良好
易于上手,基于 Spring、MyBatis 常用互联网技术堆栈作为技术底层
劣势
持久化层没有遵循 JPA 规范
Activiti 对表单的支持目前还是比较弱的,流程表单设计还是需要开发人员去处理
Activiti 的简单 demo 实验不难,但是若想结合实际业务灵活使用 Activiti,需要花费不少时间。

2.2 flowable

简介
2016 年 10 月,Activiti 工作流引擎的主要开发者离开 Alfresco 公司并在 Activiti 分支基础上开启了 Flowable 开源项目, 是 Activiti 的一个分支
activiti5 以及 activiti6、flowable 是 Tijs Rademakers 团队开发的。
Activiti7 是 Salaboy 团队开发的。activiti6 以及 activiti5 代码目前有 Salaboy 团队进行维护。因为 Tijs Rademakers 团队去开发 flowable 框架了,所以 activiti6 以及 activiti5 代码已经交接给了 Salaboy 团队(可以理解为离职之前工作交接)。目前的 activiti5 以及 activiti6 代码还是原 Tijs Rademakers 原有团队开发的。Salaboy 团队目前在开发 activiti7 框架。对于 activiti6 以及 activiti5 的代码官方已经宣称暂停维护了。activiti7 就是噱头 内核使用的还是 activiti6。并没有为引擎注入更多的新特性,只是在 activiti 之外的上层封装了一些应用。activiti6 的很多框架 bug 在 flowable 框架中已经修复的差不多了, 可以实现零成本从 activiti 迁移到 flowable
也新增了很多功能, 如 flowable 支持 jms、rabbitmq、mongodb 等方式处理历史数据

2.3 jBPM

简介
jBPM 是公开源代码项目,jBPM 在 2004 年 10 月 18 日,发布了 2.0 版本,并在同一天加入了 JBoss,成为了 JBoss 企业中间件平台的一个组成部分,它的名称也改成 JBoss jBPM。
优势
jBPM 最大的优势是采用了 Apache Mina 异步通信技术,采用 JPA/JTA 持久化方面的标准,以功能齐全的 Guvnor 作为流程仓库,有 RedHat(http://jBoss.org 被红帽收购) 的专业化支持
劣势
对自身技术依赖过紧且目前仅支持 BPMN2
JBPM 网上集成的资料甚少,且新版本相对比较笨重。
jBPM7 主要与 JBoss 下的规则引擎集成较好

2.4 jFlow

简介
jFlow 属于济南驰骋信息技术有限公司的开源项目,向社会 100% 开源。研发于 2003 年,到一直持续到现在,功能强大丰富,图形化的配置,功能性配置较高,在中国国情下成长起来的优秀的工作流引擎。在国内有一定的市场地位,是国内著名的老牌工作流引擎。
前身 ccFlow,.NET 开源的工作流. jFlow 是 java 版本
优势
jFlow 是 JFlow 流程引擎 +CCForm 的表单引擎的有机结合,内容相对复杂,配置程度较高,实施周期短,上手快。
劣势

3 整体对比

适用场景
如果是需求比较明确,流程相对固定的情况,建议自行开发。
如果是流程非常复杂,流程中分支特别多,可以考虑使用
最好是抱着完全摸清楚表结构,并适当二次开发,来适应需求

工作流引擎 功能 文档 环境部署
Activiti 支持绝大部分工作流功能,符合中国国情的审批流程需要在此基础上进行开发。 文档丰富,csdn 有相应专栏,并且国人贡献了一本《activiti 实战》详细的讲解了基于 activiti 的开发内容,网上教程资源丰富。 官方提供 webapp war 包,部署在 Tomcat 下可快速操作和了解 activiti,eclipse 提供支持 activiti 项目的 ide 插件,总的来说环境支持良好。
jBPM 支持绝大部分工作流程,符合中国国情的审批需继续二次开发。 中文文档相对匮乏,网上教程资源参考价值不大。 -
jFlow 支持大部分流程的基础功能:前进、后退、转向、转发、撤销、抄送、挂起、草稿、委托代办,也支持高级功能取回审批、项目组、外部用户等 公司提供完整详细的接口文档和操作手册,属于国内公司开源项目,有专门的 BBS 论坛 官方提供快速运行体验 http://demo.ccflow.org/,也可按照教程部署到本地 Tomcat 下访问本地 http://127.0.0.1:8080/jflow-web/ 地址测试。

学习成本 Activiti 上手比较快,界面也比较简洁、直观,学习周期相对较短。 功能丰富复杂,众多的 api 接口,全英文的文档,因此学习周期比较长 资源相对丰富,文档接口完善,需要学习内容较多,但有良好的文档支持,学习周期一般。
项目规模及二次开发难度 代码量大,核心代码改动难度较大,但提供了完整的技术文档,架构良好,网上开发文档较多,一定上降低了二次开发的难度 代码量大,核心代码改动难度较大,技术文档少,二次开发难度大。 整个核心源码大小在 10M 左右,官方提供几个 demo 开发教程,并且有相关的 BBS 论坛,一定上降低了二次开发的难度。
可视化流程表单设计器 支持,用户体验好,但是流程设计器是英文版,还需要汉化。 支持,但是用户体验不好,设计器属于英文版本,需要汉化。 支持,用户体验好,设计器属于中文版本,支持绑定表单格式。
表单设计器 支持多种表单:动态表单,外置表单,普通表单,但表单设计未集成,需要自己集成表单设计。 用户体验不好。 用户体验好,提供设计的表单组件,表单设计所见即所得,功能丰富。
官方文档 https://www.activiti.org/userguide/index.html https://docs.jboss.org/jbpm/release/7.33.0.Final/jbpm-docs/html_single/ http://ccbpm.mydoc.io/
附:
flowable 对比 activiti6 新增的功能
flowable 目前已经支持加签、动态增加实例中的节点、支持 cmmn、dmn 规范。这些都是 activiti6 目前版本没有的。
1、flowable 已经支持所有的历史数据使用 mongdb 存储,activiti 没有。
2、flowable 支持事务子流程,activiti 没有。
3、flowable 支持多实例加签、减签,activiti 没有。
4、flowable 支持 httpTask 等新的类型节点,activiti 没有。
5、flowable 支持在流程中动态添加任务节点,activiti 没有。
6、flowable 支持历史任务数据通过消息中间件发送,activiti 没有。
7、flowable 支持 java11,activiti 没有。
8、flowable 支持动态脚本,,activiti 没有。
9、flowable 支持条件表达式中自定义 juel 函数,activiti 没有。
10、flowable 支持 cmmn 规范,activiti 没有。
11、flowable 修复了 dmn 规范设计器,activit 用的 dmn 设计器还是旧的框架,bug 太多。
12、flowable 屏蔽了 pvm,activiti6 也屏蔽了 pvm(因为 6 版本官方提供了加签功能,发现 pvm 设计的过于臃肿,索性直接移除,这样加签实现起来更简洁、事实确实如此,如果需要获取节点、连线等信息可以使用 bpmnmodel 替代)。
13、flowable 与 activiti 提供了新的事务监听器。activiti5 版本只有事件监听器、任务监听器、执行监听器。
14、flowable 对 activiti 的代码大量的进行了重构。
15、activiti 以及 flowable 支持的数据库有 h2、hsql、mysql、oracle、postgres、mssql、db2。其他数据库不支持的。使用国产数据库的可能有点失望了,需要修改源码了。
16、flowable 支持 jms、rabbitmq、mongodb 方式处理历史数据,activiti 没有。