我爱你爱到不自私的地步。就像一个人手里一只鸽子飞走了,他从心里祝福那鸽子的飞翔。----王小波 2020.09.07
工作流引擎(Workflow Engine )
例如开发一个系统,最关键的部分不是系统的界面,也不是和数据库之间的信息交换,而是如何根据业务逻辑开发出符合实际需要的程序逻辑并确保其稳定性、易维护性(模块化和结构化)和弹性(容易根据实际业务逻辑的变化作出程序上的变动,例如决策权的改变、组织结构的变动和由于业务方向的变化产生的全新业务逻辑等等)。 Workflow 引擎解决的就是这个问题:如果应用程序缺乏强大的逻辑层,势必变得容易出错(信息的路由错误、死循环等等)。
就好比一辆汽车,外表做得再漂亮,如果发动机有问题就只是一个摆设。应用系统的弹性就好比引擎转速方面的性能,加速到100 公里需要1 个小时(业务流程发生变动需要进行半年的程序修改)还能叫好车吗?引擎动不动就熄火(程序因为逻辑的问题陷入死循环)的车还敢开吗?
Activiti简介
Activiti 是由 jBPM 的创建者 Tom Baeyens 离开 JBoss 之后建立的项目,构建在开发 jBPM 版本 1 到 4 时积累的多年经验的基础之上,旨在创建下一代的 BPM 解决方案。
Activiti是一个开源的工作流引擎,它实现了BPMN 2.0规范,可以发布设计好的流程定义,并通过api进行流程调度。
Activiti 作为一个遵从 Apache 许可的工作流和业务流程管理开源平台
,其核心是基于Java的超快速、超稳定的BPMN2.0 流程引擎
,强调流程服务的可嵌入性和可扩展性,同时更加强调面向业务人员。
Activiti 流程引擎重点关注在系统开发的易用性和轻量性上。每一项 BPM 业务功能, Activiti 流程引擎都以服务的形式提供给开发人员。通过使用这些服务,开发人员能够构建出功能丰富、轻便且高效的 BPM 应用程序。
- Activiti是一个针对企业用户、开发人员、系统管理员的轻量级工作流业务管理平台。
- Activiti是在ApacheV2许可下发布的,可以运行在任何类型的Java程序中例如服务器、集群、云服务等。Activiti可以完美地与Spring集成。
- 基于简约思想的设计使Activiti非常轻量级。
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 Engine:
作为最核心的模块,提供针对BPMN 2.0规范的解析、执行、创建、管理(任务、流程实例)、查询历史记录并根据结果生成报表。
- Activiti Modeler :
是模型设计器,其并非由Activiti公司所开发,而是由业界认可的Signavio公司赠送的(Signavio e原本是收费的产品,现在被免费授权给Activiti用户使用)。适用于业务人员把需求转换为规范流程定义。
- Activiti Designer:
功能和Activiti Modeler类似,同样提供了基于BPMN 2.0规范的可视化设计功能,但是目前还没有完全支持BPMN规范的定义。适用于开发人员,可以把业务需求人员用Signavio设计的流程定义(XML格式)导入到Designer中,从而让开发人员将其进一步加工成为可以运行的流程定义。
- Activiti Explorer:
可以用来管理仓库、用户、组,启动流程、任务办理等。此组件使用REST风格API,提供一个基础的设计模型。如果业务简单,也可以直接使用无需开发。还可以作为后台管理员的流程、任务管理系统使用。
- Activiti REST:
提供Restful风格的服务,允许客户端以JSON的方式与引擎的REST API交互,通用的协议具有跨平台、跨语言的特性。
工作流概念
工作流(Workflow)
,就是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档、信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现”。
工作流管理系统(Workflow Management System, WfMS)
是一个软件系统,它完成工作量的定义和管理,并按照在系统中预先定义好的工作流规则进行工作流实例的执行。工作流管理系统不是企业的业务系统,而是为企业的业务系统的运行提供了一个软件的支撑环境。
工作流管理联盟(WfMC,Workflow Management Coalition)
给出的关于工作流管理系统的定义是:工作流管理系统是一个软件系统,它通过执行经过计算的流程定义去支持一批专门设定的业务流程。工作流管理系统被用来定义、管理、和执行工作流程。
工作流管理系统的目标
:管理工作的流程以确保工作在正确的时间被期望的人员所执行——在自动化进行的业务过程中插入人工的执行和干预。
Activiti5是由Alfresco软件在2010年5月17日发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。Activiti基于Apache许可的开源BPM平台,创始人Tom Baeyens是JBoss jBPM的项目架构师,它特色是提供了eclipse插件,开发人员可以通过插件直接绘画出业务 .
工作流引擎
ProcessEngine对象,这是Activiti工作的核心。负责生成流程运行时的各种实例及数据、监控和管理流程的运行。
BPMN :业务流程建模与标注(Business Process Model and Notation,BPMN) ,描述流程的基本符号,包括这些图元如何组合成一个业务流程图(Business Process Diagram)
数据表
表名称 | 表含义 |
act_evt_log | 事件处理日志表 |
act_ge_bytearray | 通用的流程定义和流程资源 |
act_ge_property | 系统相关属性 |
表名称 | 表含义 |
act_hi_actinst | 历史的流程实例 |
act_hi_attachment | 历史的流程附件 |
act_hi_comment | 历史的说明性信息 |
act_hi_detail | 历史的流程运行中的细节信息 |
act_hi_identitylink | 历史的流程运行过程中用户关系 |
act_hi_procinst | 历史的流程实例 |
act_hi_taskinst | 历史的任务实例 |
act_hi_varinst | 历史的流程运行中的变量信息 |
表名称 | 表含义 |
act_id_group | 身份信息-组信息 |
act_id_info | 身份信息-组信息 |
act_id_membership | 身份信息-用户和组关系的中间表 |
act_id_user | 身份信息-用户信息 |
表名称 | 表含义 |
act_procdef_info | 死信任务 |
表名称 | 表含义 |
act_re_deployment | 部署单元信息 |
act_re_model | 模型信息 |
act_re_procdef | 已部署的流程定义 |
表名称 | 表含义 |
act_ru_deadletter_job | 执行失败任务表 |
act_ru_event_subscr | 运行时事件 |
act_ru_execution | 运行时流程执行实例 |
act_ru_identitylink | 运行时用户关系信息 |
act_ru_job | 运行时作业 |
act_ru_suspended_job | 运行时暂停任务 |
act_ru_task | 运行时任务 |
act_ru_timer_job | 运行时定时任务 |
act_ru_variable | 运行时变量表 |
流程概念和术语
- (1) 一个ProcessDefinition代表的业务流程。它用于定义流程中不同步骤的结构和行为。
- (2) 部署流程定义意味着将流程定义加载到Activiti数据库中。
- (3) 流程定义主要由BPMN 2.0标准定义,也可以使用Java代码定义它们,定义的所有术语也可用作Java类。
- (4) 一旦我们开始运行流程定义,就可以称为一个流程process。
- (5) processInstance是ProcessDefinition一个执行实例。
- (6) 一个StartEvent与每一个业务流程有关,它表示该流程的切入点,同样,有一个EndEvent表示流程的结束。我们可以定义这些事件的条件。
- (7)
开始和结束之间的所有步骤(或元素)称为任务
,任务可以是各种类型的。最常用的任务是UserTasks和ServiceTasks。
UserTasks
需要由用户手动执行,另一方面,ServiceTasks配置了一段代码,每当执行到达这段代码时,代码将被执行。
SequenceFlows
用来连接任务,我们可以通过它将源元素和目标元素连接起来定义一个SequenceFlows;同样,我们还可以在SequenceFlow上定义条件,这样能在流程中创建条件路径。
Activiti提供的服务
- RepositoryService帮助我们实现流程定义的部署。此服务会处理与流程定义相关的静态数据。
- RuntimeService管理 ProcessInstances(当前正在运行的流程)以及流程变量
- TaskService会跟踪 UserTasks,需要由用户手动执行的任务是Activiti API的核心。我们可以使用此服务创建任务,声明并完成任务,分配任务的受让人等。
- FormService是一项可选服务,它用于定义中开始表单和任务表单。
- IdentityService管理用户和组。
- HistoryService会跟踪Activiti Engine的历史记录。我们还可以设置不同的历史级别。
- ManagementService与元数据相关,在创建应用程序时通常不需要。
- DynamicBpmnService帮助我们在不重新部署的情况下更改流程中的任何内容。
核心API
ProcessEngine
说明:
- 在Activiti中最核心的类,其他的类都是由他而来。
- 产生方式:
- 可以产生RepositoryService
- 可以产生RuntimeService
- 可以产生TaskService
各个Service的作用:
-
·RepositoryService ·
管理流程定义
- 是Activiti的仓库服务类。所谓的仓库指流程定义文档的两个文件:bpmn文件和流程图片。
- 产生方式:可以产生DeploymentBuilder,用来定义流程部署的相关参数
- 删除流程定义
-
RuntimeService
· 执行管理,包括启动、推进、删除流程实例等操作
- 是activiti的流程执行服务类。可以从这个服务类中获取很多关于流程执行相关的信息。
-
·TaskService
·任务管理
- 是activiti的任务服务类。可以从这个类中获取任务的信息。
-
·HistoryService·
历史管理(执行完的数据的管理)
- 是activiti的查询历史信息的类。在一个流程执行完成后,这个对象为我们提供查询历史信息。
-
IdentityService
·组织机构管理 - ·
FormService
· 一个可选服务,任务表单管理 -
ManagerService
-
ProcessDefinition
: 流程定义类。可以从这里获得资源文件等。 -
ProcessInstance
:代表流程定义的执行实例。请了一天的假,她就必须发出一个流程实例的申请。一个流程实例包括了所有的运行节点。我们可以利用这个对象来了解当前流程实例的进度等信息。流程实例就表示一个流程从开始到结束的最大的流程分支,即一个流程中流程实例只有一个。 -
Execution
:Activiti用这个对象去描述流程执行的每一个节点。在没有并发的情况下,Execution就是同ProcessInstance。流程按照流程定义的规则执行一次的过程,就可以表示执行对象Execution。 - 这个例子有一个特点:wire money(汇钱)和archive(存档)是并发执行的。 这个时候,总线路代表ProcessInstance,而分线路中每个活动代表Execution。
总结
:
*一个流程中,执行对象可以存在多个,但是流程实例只能有一个
。
-
当流程按照规则只执行一次的时候,那么流程实例就是执行对象
。
HelloWorld程序(模拟流程的执行)
部署流程实例:
使用RepositoryService部署流程定义,addClasspathResource表示从类路径下加载资源文件,一次只能加载一个文件 。
启动流程
这里使用RuntimeService启动流程实例 ,
查看我的个人任务。
这里使用TaskService完成任务的查询
**完成我的个人任务 **
这里使用TaskService完成任务的办理