工作流

零、工作流相关概念

1、工作流(Workflow)

工作流是对工作流程及其各操作步骤之间业务规则的抽象、概括、描述。

工作流建模,即将工作流程中的工作如何前后组织在一起的逻辑和规则在计算机中以恰当的模型进行表示并对其实施计算。工作流要解决的主要问题是:为实现某个业务目标,在多个*参与者*之间,利用计算机,按某种预定规则*自动传递*文档、信息或者任务。

工作流管理系统(Workflow Management System, WfMS)的主要功能是通过计算机技术的支持去定义、执行和管理工作流,协调工作流执行过程中工作之间以及群体成员之间的信息交互。工作流需要依靠工作流管理系统来实现。工作流属于计算机支持的协同工作(Computer Supported Cooperative Work,CSCW)的一部分。后者是普遍地研究一个群体如何在计算机的帮助下实现协同工作的。

​ ————来自维基百科。

工作流最大的好处是 系统自动流转。拿上面的文档管理系统来说系统可以自动按照设定的步骤流转,如果系统可以处理的,自动处理掉,如果系统不可以处理那用某种方式通知需要处理的人,让人介入,而不需要人主动去关注现在应该做哪个步骤。

2、BPMN(Business Process Model and Notation)

业务流程模型注解(Business Process Modeling Notation - BPMN)是 业务流程模型的一种标准图形注解。这个标准 是由对象管理组(Object Management Group - OMG)维护的。

基本上,BPMN规范定义了任务看起来怎样的,哪些结构可以 与其他进行连接,等等。这就意味着意思不会被误解。

推荐阅读:BPMN 2.0

Activiti用户手册-BPMN2.0

一、术语和名词

工作流引擎:抽象的业务流程设计模型,负责业务流程的定义,解释和运转。

工作流模版:用工作流引擎的基本概念和路由过程表示出一个业务办理过程,这个过程通常是用xml格式的文件来记录的,这个xml文件,就是工作流模版,也可以说是流程模版。

工作流名称:就是工作流模版文件的名称。也可以叫流程名称。

工作流版本:工作流模版的版本,也可以叫流程版本。在工作流系统中,对工作流模版有个版本管理,新建一个工作流模版时候,它的工作流模版是.1。当再次做修改的时候,可以选择创建新的版本,如.2。 因为一旦业务流程模版投入使用了,有了运行的流程实例了,再次对业务流程做的修改,就需要更新到新的版本中,原来的流程版本还需要存在,原来的流程定义信息,按版本仍然能查询到。新的修改在新的版本中。 流程名称+流程版本 是唯一标识一个业务流程的。

工作流建模:利用流程设计器将业务处理过程用工作流的节点方式表示出来,就是工作流建模,也可以说是流程建模。

工作流节点:是工作流引擎的设计基本节点,一个节点表示一个业务处理过程,在流程设计器中,会有相应的表示方式。

流程实例:按照工作流模版定义的处理过程启动运行的业务处理过程,即流程实例。利用建立好的业务流程模版,可以多次启动流程实例,一个流程实例即一个业务处理过程。如请假审批的流程,张三填写他的请假单,启动一个审批流程实例。李四也填写一个自己的清单单,也是启动了一条流程实例。

流程实例id:每条启动的流程实例,在工作流引擎中,都会对应一个流程实例id,来唯一标识这条流程实例。

轨迹id: 轨迹id通常是指流程节点的运行轨迹id,当一个节点在流程实例中被反复运行的时候(如循环路由,自由流),每次到达这个节点的时候,都会产生一个轨迹 id,trace_id, 唯一标识这次的运行轨迹。

业务数据: 流程中每个节点上处理的业务记录等。通常流程数据和业务数据是有关联的。

流程设计器:利用工作流引擎的设计基本节点和概念给业务流程建模的可视化编辑工具,就是流程设计器。

当前步骤:流程实例未结束前,正运行到的当前节点,为当前步骤。

历史步骤:流程实例运行完成的节点,都认为是历史步骤。

流程实例运行轨迹:每条流程实例在工作流模版的节点上运行的轨迹。

流程实例监控:监控每个流程实例在各个节点的运行情况。

任务:每条流程实例在运行到流程的各个节点时,会产生一些待执行的任务信息。有任务名称,描述,和参与人,完成人等任务的基本信息。通过任务链接到待处理的业务过程。

任务参与人:任务信息的参与人,能够查看到任务的相关人。

任务执行人:可执行任务的操作人。

任务工单:任务派发下来的工单。

串行路由:业务建模中,节点按顺序一个一个的往后串联的方式。

并行路由:业务建模中,节点并行的方式往后链接。

条件路由:业务建模中,按设置的条件为真,链接一个路由方式,条件为false,往后链接一个路由方式。在流程实例运行时,只会执行一条路由,即条件要么=true,要么=false.

分支:业务建模中,平行分支的节点路由方式。

合并:业务建模中,将平行分支的节点路由再合并起来的路由方式。

子流程:为一个独立的业务流程,嵌入到主流程中。

循环路由:在节点间或同一个节点上循环执行的路由方式。

自由流:流程实例不按照流程模版中预定义好的节点顺序往下执行,而是可以自由的跳转。

回退流:流程实例不按照流程模版中预定义好的节点顺序往下执行,而是回退到曾经运行过的任意节点上。

业务补偿类:在流程发生自由跳转的时候,需要辅助执行一些业务处理过程来对业务数据进行修改。

二、设计工作流

传统的工作流程来说大致可以分为这样几种情况:

自由/半自由流程、固定流程、分支流程、并发流程与执行、并发流程或执行;

自由流程指的是从生产者到处理者每一个流程节点都可以由上个节点的操作者指定角色,

半自由流程指的是指定角色的时候限定一定的范围。

固定流程指的是流程是所有的流程即角色都是固定好的,不能修改。

这种情况的优点和缺点都极度的明显:优点即操作简单,逻辑简单,开发难度小。缺点为实用性较小,较为死板,不够灵活。

分支流程指的是当流程满足某一个跳转条件时即进行流程的跳转执行子流程,当流程执行完毕后再跳回到主流程进行接下来的流程操作。比如某次采购单的采购,当采购金额小于100万时需要采购经理即可进行审批,当大于100万时需要副总级别的人物进行审批后才可以进行。

并发流程与执行指的是多个流程共同执行,所有流角色程都执行完毕后才流转到下一个节点,比如某次项目的开始需要招商部,企划部,工程部共同完成。只有当这些角色都审批完成了才能开始。并发流程或执行指的是多个流程共同开始,只要有一个角色进行审批了,则流转到下一个节点。在此不做赘述。在一般涉及到工作流的后台中,这几种情况大致就可以满足。

以上可以称之为标准工作流,即后台给予固定的模板,相关配置人员进行配置即可。但是,在有些复杂的后台系统中,可能是以上几种情况共同出现的,也可能是出现了其他情况,这个时候,就需要整体流程定制化的操作。那么,要设计一个非标准工作流,首先是分清上文提到的角色、内容、流程之间的关系——即角色与内容是挂在流程节点上的功能点。所以我们只需要将流程节点控制好,再将不同的角色,以及对应的操作内容挂靠上去即可,这样一来是可以方便理清关系,另外也可以使系统更有层次。

所以接下来我们只需要将流程节点控制好即可。

推荐阅读:工作流设计剖析

自定义流程参考:

一套完整自定义工作流的实现

工作流系统的设计——作者来自亚马逊,现就职于Oracle

三、现有引擎

名称 当前版本 可用的流程定义语言 框架 网站 特点
Activiti 6.0.0 BPMN 2.0 Java Activiti Official Website 操作简单倾向于人为参与的task,例如填写表单之类的。但是Activitie支持的应用程序服务器有限。
jBPM 6.5.0 BPMN 2.0 Java EE jBPM Official Website 基于WebService - HumanTask标准来描述人工任务和管理生命周期
flowable 6.2.0 BPMN 2.0 Java flowable official Website 1、异步处理历史数据。2、回退功能,运行通过API方式,让工作流当前状态回滚到之前的状态。etc.
Bonita 7.6 BPMN 2.0 Java Bonitasoft Official Website 免费版功能有限
Camunda BPM 7.8.0 BPMN 2.0, CMMN 1.1, DMN 1.1 Java Camunda Official Website 1、提供更多在业务流程中对事物边界的控制,用来更好的支持自动化的批量工作流程(dark processing)2、支持很多类型的应用程序服务器。
Fixflow 5.2(4年前) BPMN 2.0 Java Fixflow 方正自主研发的开源BPM流程引擎
ActiveVOS 9.2.2 BPMN 2.0, WS-BPEL 2.0 Java EE ActiveVOS Official Website
AgilePoint iBPMS 6 BPMN 2.0 AgilePoint Official Website
AtosBPM 5 BPMN 2.0 Java AtosBPM Official Website
AuraPortal Helium BPMN 2.0 AuraPortal Helium Official Website
Beanflow 维护至2008 Java BeanFlow BeanFlow是一个用于创建工作流的轻量级java类库,它使用bean来组织、协调事件。你可以把BeanFlow想像成是BPEL的一种简单选择,在其工作流上的所有说明定义和实现都是采用java代码来代替XML描述。
Bizagi BPM Suite 11 BPMN 2.0 Java EE and .NET Bizagi Official Website
Bpmn 0.2.0 BPMN 2.0 Js on top of Node.js Bpmn Official Website
BPMN Modeler (for Confluence) 1.0.8 BPMN 2.0, CMMN 1.1, DMN 1.1 Java / Javascript viadee Official Website
Catify BPMN Engine 1.1 BPMN 2.0 Java Catify Official Website
edoras one 1.6.11 BPMN 2.0 Java edorasware official Website
Fabasoft Folio Spring, 2014 BPMN 2.0 Fabasoft Folio Official Website
FireStart BPM Suite 4 BPMN 2.0 .NET FireStart Official Website
GLDNHRN 2.35 BPMN 2.0 .NET, Javascript GLDNHRN Official Website
IBM Business Process Manager 8.5 BPMN 2.0, WS-BPEL 2.0 IBM Business Process Manager Official Website
Imixs-Workflow 3.3.0 BPMN 2.0 Java EE Imixs Official Website
inubit BPM 7.2 BPMN 2.0 Java Bosch Business Process Management Official Website
MyProcess BPM 2.3.0.2 BPMN 2.0 .NET, ASP.NET MyData Official Website
Omni Workflow 1.1.1 BPMN 2.0 PHP Workflow OmniBuilder Official Website
Oracle BPM 12c BPMN 2.0, WS-BPEL 2.0 Java Oracle BPM Official Website
Orchestra 4.9.0 BPMN 2.0,WS-BPEL 2.0 Apache Axis, Apache CXF, OSGi, Java EE Orchestra Official Website
ProcessMaker Workflow Management Software 3.2.1 BPMN 2.0 php ProcessMaker Workflow Management Software Official Website
SAP Business Process Management 7.4 BPMN 2.0 Java EE SAP BPM Official Website
Signavio Workflow Accelerator 3.42 BPMN 2.0 Java on Cloud Signavio Workflow Accelerator Official Website
Stardust 2 BPMN 2.0 Java Stardust Official Website
Sydle SEED 10.04 BPMN 2.0 Java on Cloud Sydle Official Website
TIM 5.3 BPMN 2.0 Java TIM Official Website
Viewflow 0.12.2 部分BPMN 2.0 Python Official Website demo
W4 BPMN+ 9 BPMN 2.0 Java W4 BPMN+ Official Website
WebMethods Business Process Management Platform 9.6 BPMN 2.0 Java WebMethods Official Website
Workflow Engine 2.2 BPMN 2.0 Java, .NET, .NET Core Workflow Engine Official Website demo
Workflower 1.4.0 BPMN 2.0 PHP Workflower Github
XML Frames 1.6.7 部分 BPMN 2.0 Lazarus Free Pascal Official Website

四、推荐引擎对比

根据简单筛选,国内使用jBPM和Activiti居多,Flowable5为Activiti员工fork出来的,和Activiti5基本一致,故对比这三个 。

名称 jBPM Activiti Flowable
当前版本 6.5.0 6.0.0 6.2.0
可用的流程定义语言 BPMN 2.0 BPMN 2.0 BPMN 2.0
框架 Java EE Java Java
网站 jBPM Official Website Activiti Official Website flowable official Website
事务管理 Bitronix,基于JTA事务管理 Mybatis机制/Spring事务机制
详细介绍 jBPM5使用http://jBoss.org社区的大多数组件,以Drools Flow为核心组件作为流程引擎的核心构成,以hibernate作为数据持久化ORM实现,采用基于JPA/JTA的可插拔的持久化和事务控制规范,使用Guvnor作为流程管理仓库,能够与Seam、Spring、OSGi等集成。 Activiti5使用Spring进行引擎配置以及各个Bean的管理,综合使用IoC和AOP技术,使用CXF作为Web Services实现的基础,使用MyBatis进行底层数据库ORM的管理,预先提供Bundle化包能较容易的与OSGi进行集成,通过与Mule ESB的集成和对外部服务(Web Service、RESTful等)的接口可以构建全面的SOA应用 flowable5与activiti5的差异不太大,API大部分只是包名不同。维护频率高,添加了部分新特性。Activiti引入抽象数据层
优点 基于WebService - HumanTask标准来描述人工任务和管理生命周期。jPBM6数据库基于Git/表单设计/数据可视化 操作简单原生Spring支持倾向于人为参与的task,例如填写表单之类的。最为安全可靠 1、异步处理历史数据。2、回退功能,运行通过API方式,让工作流当前状态回滚到之前的状态。3、增加和拓展对事件子流程的支持4、提高对事件监听器事务生命周期的支持5、新增全局Counter功能
缺点 回退需要自行实现
web应用程序 KIE Workbench Activiti App Flowable Designer(需要 Eclipse Mars或Neon
IDEA插件 actiBPM(3年未更新)
要求 JDK 6+&&Ant 1.7+ JDK7+ JDK8+
学习要求 比较复杂、网上学习资料多为jPBM5 较简单,学习曲线较低 类似Activiti,学习资料较少
推荐学习资料 暂无 暂无 http://www.shareniu.com/category/236.htm
使用人数
历史 在创建者Tom Baeyens离开JBoss后,下一个版本jBPM5完全放弃了jBPM4的基础代码,基于Drools Flow重头来过 2010年JBPM的主创人员Tom离开了Jboss并加入了Alfresco公司发布了Activiti5.0 2016年10月Activiti原班主创人员从Activiti分离出来的一套工作流引擎

综合考虑下来,

Flowable虽基本和Activiti一致,但是学习资料缺乏、使用人数少,故不推荐。

延伸阅读:关于中国式驳回:F2BPM中关于工作流引擎驳回设计

五、Activiti使用

官方网站:

GitHub

官网

Activiti 5.16 用户手册:中文版的用户手册,基本按照流程来能实现搭建

Activiti User Guide:Activiti6.0.0的英文版用户手册,可参照中文版来。5.x中的ActivitiExplorer在6.0.0中改为ActivitiApp文件,此处需要注意。

Quick Start Guide:6.0的快速开始,学习价值不高,做下来也没怎么了解其中的原理。

附上activiti自建的表说明:

Activiti6工作流总共包含28张数据表,所有的表名默认以“ACT_”开头,并且表名的第二部分用两个字母表明表的用例,而这个用例也基本上跟Service API匹配。

· ACTGE* : “GE”代表“General”(通用),用在各种情况下;

· ACTHI* : “HI”代表“History”(历史),这些表中保存的都是历史数据,比如执行过的流程实例、变量、任务,等等。

· ACTID* : “ID”代表“Identity”(身份),这些表中保存的都是身份信息,如用户和组以及两者之间的关系。如果Activiti被集成在某一系统当中的话,这些表可以不用,可以直接使用现有系统中的用户或组信息;

· ACTRE* : “RE”代表“Repository”(仓库),这些表中保存一些‘静态’信息,如流程定义和流程资源(如图片、规则等);

· ACTRU* : “RU”代表“Runtime”(运行时),这些表中保存一些流程实例、用户任务、变量等的运行时数据。Activiti只保存流程实例在执行过程中的运行时数据,并且当流程结束后会立即移除这些数据,这是为了保证运行时表尽量的小并运行的足够快;

参考资料:

工作流引擎Activiti使用总结

Activiti与JBPM概念和差异(整理和汇总)

六、附

在搜索Activiti的IDEA插件的时候发现了一款国人开发的插件叫做Yaoqiang BPMN Editor,评价优秀,但是其Licensing中限制商用,故不再做深入研究。

附:

Licensing

Yaoqiang BPMN Editor is published under the GNU General Public License version 3.0 (GPLv3) for inclusion in programs published under a compatible open-source license. If you want to use Yaoqiang BPMN Editor in commercial, then you should purchase a commercial license. To buy a commercial license of version 3, please contact: shi_yaoqiang@yahoo.com