工作流
(1)工作流
工作流(Workflow),就是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档、信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现”。
常见的工作流框架有Activiti、JBPM、OSWorkFlow、WorkFlow。本系列使用Activiti5.13版本。
工作流框架底层需要有数据库提供支持,activiti5.13版本,有23张表。JBPM4.4框架有18张表。JBPM底层使用hibernate操作数据库。Activiti框架底层使用的mybatis操作数据库。
(2)工作流引擎
ProcessEngine对象是Activiti工作的核心。负责生成流程运行时的各种实例及数据、监控和管理流程的运行
(3)BPMN
业务流程建模与标注(Bussiness Process Model and Notation),描述流程的基本符号,包括通过图元组合成一个业务流程图。
目前工作流的开源软件主要是activiti、flowable、camunda
Activiti 概述
Activiti5是由Alfresco软件在2010年5月17日发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。Activiti基于Apache许可的开源BPM平台,创始人Tom Baeyens是JBoss jBPM的项目架构师,它特色是提供了eclipse插件,开发人员可以通过插件直接绘画出业务流程图
在一个公司中,每一项业务的开始和结束,都可以理解为一个工作流,例如,公司的费用报销的基本流程如下:
如图所示的工作流:员工先提出费用报销申请,提交该申请给部门领导,部门领导审批后,再提交给财务部门审批,审批完成后,通知提出申请的员工可以报销,即报销流程结束。整个步骤按照正常工作方式一步步完成,这就是一个简单而又完整的工作流工作流可以理解为从开始节点发起流程,然后经过其中多个节点,完成动作,最后到结束节点的整个过程。
工作流系统
一个软件系统中如果具有工作流系统,就把它称为工作流系统。一个系统中的工作流的功能是对系统业务流程进行自动化管理。一个软件系统的核心根本上还是业务流程,工作流只是协助业务流程的管理,即使没有工作流业务一样能照常展开,只不过使用工作流可以更好地管理业务流程,提高系统的扩展性
工作流的具体应用有:
(1)关键业务类:订单、报价处理、合同审核、供应链管理等等
(2)行政管理类:出差申请、请假申请、日报周报等等
(3)人事管理类:员工培训安排、变动处理等等
(4)财务相关类:收付款处理、报销处理、预算申请等等
(5)客户服务类:客户信息管理、客户投诉、请求处理、售后服务等等
工作流引擎
在没有工作流引擎之前,为了实现流程控制,通常的做法是采用状态字段的值来跟踪流程的变化。例如设立一个字段,初始值为:0,经过某些流程后变成:1,变成:2,最后根据这个值来判断状态,给出相应的处理。
很明显,这样一来工作的流程会和业务高度耦合,当流程发生变更时,所编写的代码也必须做出调整。如果有一样工具能帮助我们管理工作流,并做到当业务流程变化之后,程序不需要跟着发生变化,那么我们的业务系统的适应能力将会有大幅提升。
Activit7是一个工作流引擎,可以将业务系统中复杂的业务流程抽取出来,使用专门的建模语言BPMN2.0进行定义,业务流程将按照预定义的流程执行。系统的流程由Activiti管理,从而减少业务系统由于流程变化而导致的工作量,提高系统健壮性。
业务流程管理(BPM)
BPM(Business Process Management)即业务流程管理,是一种规范化的构造端到端的业务流程,以持续提高组织业务效率。
BPM软件就是根据企业中业务环境的变化,推进人与人之间、人与系统之间以及系统与系统之间的整理及调整的经营方法与解决方案的IT工具。使用BPM软件对企业内部及外部的业务流程的整个生命周期进行建模、自动化、管理监控和优化,可以降低企业成本,提高利润。
BPMN(Business Process Model AndNotation)即业务流程模型和符号,是一套标准的业务流程建模符号,使用BPMN提供的符号可以创建业务流程。Activiti就是使用BPMN进行流程建模、流程执行管理的。
BPMN2.0是业务流程建模符号2.0的缩写,它由Business Process Management Initiative这个非营利协会创建并不断发展。BPMN2.0是使用一些符号来明确业务流程设计流程图的一套符号规范,能增进业务建模时的沟通效率。目前BPMN2.0是最新的版本,它用于在BPM上下文中进行布局和可视化的沟通。
BPMN2.0的基本符号主要包含:
(1)事件(Event)
(2)活动(Activity)
活动是工作或任务的一个通用术语。一个活动可以是一个任务,还可以是一个当前流程的子处理流程;其次,你还可以为活动指定不同的类型。常见活动如下:
(3)网关(GateWay)
网关用来处理决策,有几种常用网关需要了解:
①排它网关
只有一条路径会被选择。流程执行到该网关时,按照输出流的顺序逐个计算,当条件的计算结果为 true 时,继续执行当前网关的输出流;如果多条线路计算结果都是 true,则会执行第一个值为 true 的线路。如果所有网关计算结果没有 true,则引擎会抛出异常。排他网关需要和条件顺序流结合使用,default 属性指定默认顺序流,当所有的条件不满足时会执行默认顺序流
②并行网关
所有路径会被同时选择
拆分:并行执行所有输出顺序流,为每一条顺序流创建一个并行执行线路
合并:所有从并行网关拆分并执行完成的线路均在此等候,直到所有的线路都执行完成才继续向下执行
③包容网关
可以同时执行多条线路,也可以在网关上设置条件
拆分:计算每条线路上的表达式,当表达式计算结果为 true 时,创建一个并行线路并继续执行
合并:所有从并行网关拆分并执行完成的线路均在此等候,直到所有的线路都执行完成才继续向下执行
④事件网关
专门为中间捕获事件设置的,允许设置多个输出流指向多个不同的中间捕获事件。当流程执行到事件网关后,流程处于等待状态,需要等待抛出事件才能将等待状态转换为活动状态
(4)流向(Flow)
流是连接两个流程节点的连线,常见的流向包含以下几种:
Activiti的特点
(1)数据持久化
Activiti的设计思想是简洁、快速。有过应用开发经验的开发人员都知道应用的瓶颈体现在和数据库交换数据的过程中,针对这一点Activiti选择了使MyBatis,从而可以通过最优的SQL语句执行Command,仅凭如此就能让引擎在速度上保持最高的性能。
(2)引擎service接口
Activiti 流程引擎重点关注在系统开发的易用性和轻量性上。每一项BPM业务功能Activiti流程引擎都以服务的形式提供给开发人员。通过使用这些服务,开发人员能够构建出功能丰富、轻便且高效的BPM应用程序。
ctiviti.cfg.xml文件为核心配置文件,该配置文件集成在Spring的IOC容器当中,可以产生ProcessEngineConfiguration对象,这个对象就是流程引擎的配置对象,ProcessEngine对象则为流程引擎对象,该对象是工作流业务系统的核心,所有的业务操作都是由这个对象所派生出来的对象实现。
Activiti引擎提供了七大Service接口,均通过ProcessEngine获取,并且支持链式API编程风格。
(3)流程设计器
在jBPM4时代有专门的Eclipse插件可以用来设计jPDL,同样Activiti团队也专门设计了用来设计BPMN 2.0规范的流程谩计器-Eclipse Designer。此外还有Signavio公司为Activiti定制的基于Web的Activiti Modeler流程设计器。喜欢用IDEA的,IDEA也有actiBPM插件支持。
(4)原生支持Spring
Activiti原生支持Spring,这一点对企业应用来说尤为重要:可以很轻松地进行Spring集成,非常方便管理事务和解析表达式(Expression)。
(5)分离运行时与历史数据
Activiti继承自jBPM4,在表结构设计方面也遵循运行时与历史数据的分离,这样的设计可以快速读取运行时数据,仅当需要查询历史数据时再从专门的历史数据表中读取。这种设计方式可以大幅提高数据的存取效率,尤其是当数据日积月累时依然能够快速反应。
Activiti部署流程
Activiti是一个工作流引擎,业务系统通过访问Activiti所提供的接口,就可以很方便的操作流程的相关数据,把工作流环境与业务系统环境集成在一起
首先使用Activiti流程建模工具(Activity-Designer)来通过BPMN2.0符号来定义业务流程,生成一个.bpmn文件。.bpmn文件就是业务流程定义文件,通过xml定义业务流程
得到.bpmn文件后,使用Activiti提供的Api把流程定义内容存储起来。接着启动一个流程实例(ProcessInstance),表示一次业务流程开始运行。
既然系统的业务流程已经交给Activiti管理,那么通过Activiti就可以查看当前流程执行到哪一步,当前用户需要办理什么任务。这些操作由Activiti帮管理,而不需要开发人员自己编写SQL语句查询。
用户查询到待办任务后,就可以开始办理某个任务了。如果这个任务办理完成后,还需要其它用户继续办理,比如:采购单创建后要交由部门经理审核,那么这个过程也是由Activiti帮完成了,总之流程可以一直走下去,直到没有下一个任务结点,那么这个流程实例也就完成了。
Activiti架构与组件
(1)Activiti Engine:解析、执行
作为最核心的模块,提供针对BPMN 2.0规范的解析、执行、创建、管理(任务、流程实例)、查询历史记录并根据结果生成报表。
(2)Activiti Modeler:模型
是模型设计器,其并非由Activiti公司所开发,而是由业界认可的Signavio公司赠送的(Signavioe原本是收费的产品,现在被免费授权给Activiti用户使用)。适用于业务人员把需求转换为规范流程定义。
(3)Activiti Designer:可视化
功能和Activiti Modeler类似,同样提供了基于BPMN 2.0规范的可视化设计功能,但是目前还没有完全支持BPMN规范的定义。适用于开发人员,可以把业务需求人员用Signavio设计的流程定义(XML格式)导入到Designer中,从而让开发人员将其进一步加工成为可以运行的流程定义。
(4)Activiti Explorer:任务管理
可以用来管理仓库、用户、组,启动流程、任务办理等。此组件使用REST风格API,提供一个基础的设计模型。如果业务简单,也可以直接使用无需开发。还可以作为后台管理员的流程、任务管理系统使用。
(5)Activiti REST:Restful风格
提供Restful风格的服务,允许客户端以JSON的方式与引擎的REST API交互,通用的协议具有跨平台、跨语言的特性。
Activiti的23张表
Activiti的后台是有数据库的支持,所有的表都以“ACT_”开头。 第二部分是表示表的用途的两个字母标识。用途也和服务的API对应。
(1)ACT_GE_*:通用数据 - general
通用数据, 用于不同场景下。
(2)ACT_RE_*:流程定义、资源 - repository
'RE’表示repository,RepositoryService接口所操作的表。这个前缀的表包含了流程定义和流程静态资源(图片、规则等)。
(3)ACT_RU_*:运行实例 - runtime
'RU’表示runtime,运行时表-RuntimeService。这些运行时的表,包含流程实例、任务、变量,异步任务等运行中的数据。 Activiti只在流程实例执行过程中保存这些数据,在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。
(4)ACT_ID_*:身份信息 - identity
'ID’表示identity(组织机构),IdentityService接口所操作的表。这些表包含用户记录,流程中使用到的用户和组。这些表包含标识的信息,如用户、用户组等
(5)ACT_HI_*:历史数据 - history
'HI’表示history。历史数据表-HistoryService。这些表包含历史数据,比如历史流程实例,变量、任务等等。
7大服务
(1)RepositoryService
Activiti中每一个不同版本的业务流程的定义都需要使用一些定义文件,部署文件和支持数据(BPMN2.0 XML文件,表单定义文件,流程定义图像文件等),这些文件都存储在Activiti 内建的Repository中。Repository Service 提供了对Repository的存取服务。
(2)RuntimeService
在Activiti中,每当一个流程定义被启动一次之后,都会生成一个相应的流程对象实例。Runtime Service提供了启动流程、查询流程实例、设置获取流程实例变量等功能。此外它还提供了对流程部署,流程定义和流程实例的存取服务。
(3)TaskService
在Activiti中业务流程定义中的每一个执行节点被称为一个Task,对流程中的数据存取,状态变更等操作均需要在Task中完成。Task Service提供了对用户Task和Form相关的操作。它提供了运行时任务查询、领取、完成、删除以及变量设置等功能。
(4)IdentityService
Activiti 中内置了用户以及组管理的功能,必须使用这些用户和组的信息才能获取到相应的 Task。Identity Service 提供了对Activiti系统中的用户和组的管理功能。
(5)ManagementService
Management Service提供了对Activiti流程引擎的管理和维护功能,这些功能不在工作流驱动的应用程序中使用,主要用于Activiti系统的日常维护。
(6)HistoryService
History Service 用于获取正在运行或已经完成的流程实例的信息,与Runtime Service中获取的流程信息不同,历史信息包含已经持久化存储的永久信息,并已经被针对查询优化。
(7)FormService
Activiti中的流程和状态Task均可以关联业务相关的数据。通过使用Form Service可以存取启动和完成任务所需的表单数据并且根据需要来渲染表单。
表分类 | 表名 | 说明 |
通用数 | act_ge_bytearray | 二进制数据表 |
act_ge_property | 属性数据表存储整个流程引擎级别的数据。初始化表结构时,会默认插入三条记录 | |
流程历史记录 | act_hi_actinst | 历史节点表 |
act_hi_attachment | 历史附件表 | |
act_hi_comment | 历史意见表 | |
act_hi_identitylink | 历史流程人员表 | |
act_hi_detail | 历史详情表,提供历史变量的查询 | |
act_hi_procinst | 历史流程实例表 | |
act_hi_taskinst | 历史任务实例表 | |
act_hi_varinst | 历史变量表 | |
身份信息 | act_id_group | 用户组信息表 |
act_id_info | 用户扩展信息表 | |
act_id_membership | 用户与用户组对应信息表 | |
act_id_user | 用户信息表 | |
流程定义、资源 | act_re_deployment | 部署信息表 |
act_re_model | 流程设计模型部署表 | |
act_re_procdef | 流程定义数据表 | |
运行实例 | act_ru_event_subscr | ThrowEvent、catchEvent时间监听信息表 |
act_ru_execution | 运行时流程执行实例表 | |
act_ru_identitylink | 运行时流程人员表,主要存储任务节点与参与者的相关信息 | |
act_ru_job | 运行时定时任务数据表 | |
act_ru_task | 运行时任务节点表 | |
act_ru_variable | 运行时流程变量数据表 |
Activiti与jBPM5的对比
jBPM5和Activiti同样支持BPMN2.0规范,但是实际上jBPM5已经推翻了jBPM3和jBPM4的架构,使用了Drools Flow作为工作流架构,这对于原来使用jBPM3和jBPM4的用户来说是非常郁闷的一件事(从零开始重新学习jBPM5),而Activiti更像是原来jBPM4的延续,因此对于原来使用jBPM3和jBPM4的用户来说,更推荐使用Activiti,但是由于JBoss中有一些优秀的项目(例如规则引擎Drools、Seam等),jBPM5与这些项目进行整合具有先天的优势,因此如何进行选择还需要进行权衡。
从技术组成来看,Activiti最大的优势是采用了PVM(流程虚拟机),支持除了BPMN2.0规范之外的流程格式,与外部服务有良好的集成能力,延续了jBPM3、jBPM4良好的社区支持,服务接口清晰,链式API更为优雅;劣势是持久化层没有遵循JPA规范。jBPM最大的优势是采用了Apache Mina异步通信技术,采用JPA/JTA持久化方面的标准,以功能齐全的Guvnor作为流程仓库,有RedHat(jBoss.org被红帽收购)的专业化支持;但其劣势也很明显,对自身技术依赖过紧且目前仅支持BPMN2。
技术组成 | Activiti | jBPM5 |
数据库持久层ORM | MyBatis3 | Hibernate3 |
持久化标准 | 无 | EJB JPA规范 |
事务管理 | MyBatis机制/Spring事务控制 | Bitronix,基于JTA事务管理 |
数据库连接方式 | Jdbc/DataSource | Jdbc/DataSource |
支持数据库 | Oracle、SQL Server、MySQL、H2、内存数据库等 | Oracle、SQL Server、MySQL、内存数据库等 |
设计模式 | 命令(Command)模式、观察者模式等 | |
内部服务通讯 | Service间通过API调用 | 基于Apache Mina异步通讯 |
集成接口 | SOAP、Mule、RESTful | 消息通讯 |
支持的流程格式 | BPMN2、xPDL、jPDL等(由PVM实现) | 目前仅只支持BPMN2 xml |
引擎核心 | PVM(流程虚拟机) | Drools |
技术前身 | jBPM3、jBPM4 | Drools Flow |
所属公司 | Alfresco | jBoss.org |
jBPM5和Activiti的主要相似之处
(1)都是BPMN2过程建模和执行环境。
(2)都是BPM系统(符合BPM规范)。
(3)都是开源项目-遵循ASL协议(Apache的软件许可)。
(4)都源自JBoss(Activiti5是jBPM4的衍生,jBPM5则基于Drools Flow)。
(5)都很成熟,从无到有,双方开始约始于2年半前。
(6)都有对人工任务的生命周期管理。Activiti5和jBPM5唯一的区别是jBPM5基于WebService - HumanTask标准来描述人工任务和管理生命周期。 如有兴趣了解这方面的标准及其优点,可参阅WS - HT规范介绍。
(7)都使用了不同风格的Oryx流程编辑器对BPMN2建模。 jBPM5采用的是Intalio维护的开源项目分支。Activiti5则使用了Signavio维护的分支。