
Spring Boot + Activiti 完美结合,快速实现工作流~
大家好,我是不才陈某~
关于工作流之前分享过一篇flowable,今天分享一下另外一个实现:Activiti
flowable的工作流实现可以看之前的文章:Spring Boot + flowable 完美结合,快速实现工作流
概念
工作流。通过计算机对业务流程自动化执行管理,主要解决的是“使在多个参与者之间按照某种预定义的规则自动进行传递文档、信息或任务的过程,从而实现某个预期的业务目标,或者促使此目标的实现”。
Activiti7
介绍
Activiti是一个工作流引擎,Activiti可以将业务系统中复杂的业务流程抽取出来,使用专门的建模语言BPMN2.0进行定义,业务流程按照预先定义的流程进行执行,实现了系统的流程由Activiti进行管理,减少业务系统由于流程变更进行系统升级改造的工作量,从而提高系统的健壮性,同时也减少了系统开发维护成本。
在使用activiti之前,首先需要编写activiti.cfg.xml
配置文件。并且引入相关依赖。
activiti.cfg.xml
activiti的引擎配置文件,包括:ProcessEngineConfiguration
的定义、数据源定义、事务管理器等。其实就是一个Spring配置文件。
Activiti流程框架,在前期主要需要了解的就是数据库表的创建、流程的部署、流程的启动和各个阶段任务的完成。
流程引擎配置类
流程引擎配置类(ProcessEngineConfiguration
),通过 ProcessEngineConfiguration
可以创建工作流引擎 ProceccEngine。
工作流引擎的创建
工作流引擎的创建主要有两种方式:默认创建方式和一般创建方式
默认创建方式
一般创建方式
当创建好工作流引擎后,对应的数据库中会自动生成25张数据库表。
ACT_GE_PROPERTY
中会先展示下一次流程的ID(next.dbid
),并且在下一次流程部署的时候,对下一次流程的ID进行赋值。
Activiti表说明
这里以表名的前缀进行说明:
Service服务接口
Activiti中还有许多的Service服务接口。这些Service 是工作流引擎提供用于进行工作流部署、执行、管理的服务接口,我们可以使用这些接口操作服务对应的数据表。
Service创建方式
通过ProcessEngine
创建Service方式:
Service总览
- RepositoryService
Activiti 的资源管理类,提供了管理和控制流程发布包和流程定义的操作。使用工作流建模工具设计的业务流程图需要使用此service将流程定义文件的内容部署到计算机。除了部署流程定义以外,还可以查询引擎中的发布包和流程定义。
暂停或激活发布包,对应全部和特定流程定义。暂停意味着它们不能再执行任何操作了,激活是对应的反向操作。获得多种资源,像是包含在发布包里的文件,或引擎自动生成的流程图。获得流程定义的pojo版本,可以用来通过java解析流程,而不必通过xml。
- Runtimeservice
Activiti的流程运行管理类。可以从这个服务类中获取很多关于流程执行相关的信息
- Taskservice
Activiti的任务管理类。可以从这个类中获取任务的信息。
- Historyservice
Activiti的历史管理类,可以查询历史信息,执行流程时,引擎会保存很多数据(根据配置),比如流程实例启动时间,任务的参与者,完成任务的时间,每个流程实例的执行路径,等等。这个服务主要通过查询功能来获得这些数据。
- ManagementService
Activiti的引擎管理类,提供了对Activiti流程引擎的管理和维护功能,这些功能不在工作流驱动的应用程序中使用,主要用于Activiti 系统的日常维护。
流程图符号说明
BPMN插件
使用IDEA进行开发,建议下载一个插件。actiBPM插件,直接搜索下载。
流程符号、画流程图
流程符号:事件Event,活动Activity,网关Gateway,流向
使用流程设计器画出流程图
- 创建bpmn文件,在流程设计器使用流程符号来表达流程,指定流程的key,指定任务负责人
- 生成png文件
- 创建的bpmn文件要放在resourse下的bpmn文件夹下。
注意:当前任务流程的ID不能是数字开头。
找到本地的文件,选择notepad打开
流程的操作
部署流程
使用 Activiti 提供的 API 把流程图的内容写入到数据库中
属于资源操作类,使用 RepositoryService
- 单文件部署:把bpmn文件和png文件逐个处理
- 压缩包部署:把bpmn文件和png文件打成压缩包来处理
- 部署操作表:
act_re_deployment
、act_re_procdef
、act_ge_bytearray
有时候我们会有多个流程,需要创建多个bpmn流程文件,这个时候想要同时部署,我们可以对bpmn文件进行打包压缩,使用Zip包进行批量的部署
操作的数据库表:
- act_ge_bytearray
- act_ge_property
- act_re_deployment
- act_re_procdef
启动流程实例
流程部署完成以后,需要启动流程实例。使用 RuntimeService
根据流程定义的 key进行启动。
核心代码:
任务查询
使用 TaskService
,根据流程定义的 key ,任务负责人来进行查询
核心代码:
任务完成
使用 TaskService
,用任务 ID 直接完成任务。
核心代码:
关于流程实例的挂起和激活
全部流程实例的挂起和激活
单个流程实例的挂起和激活
注意:流程实例在挂起的状态下是无法进行下一步操作的。
流程变量
我们在使用流程变量的时候。如果我们将一个对象存储到一个流程变量中,那么这个对象需要实现Serializable接口。
流程变量的作用域
- 整个流程实例、任务、执行实例。
- 默认:整个流程实例。
使用方法
在属性上使用UEL表达式 ${assignee}
,assignee
就是一个流程变量的名称。
在连线上使用UEL表达式 ${days<=3}
,days就是一个流程变量名称,返回结果为true或者false。
Activiti有很多种方式设置流程变量,这里简单介绍两种:
启动流程时设置流程变量
任务办理时设置
网关
用来控制流程的走向
排他网关——ExclusiveGateway
用来在流程中实现决策,当流程执行到这个网关,所有的分支都会判断条件是否为true,如果为true,则执行该分支。
注意:排他网关只会选择一个作为true的分支执行,如果有两个分支都为true,排他网关会选择ID值比较小的一条分支去执行。
如果从排他网关出去的流程所有的条件都不满足,则会抛出异常。
并行网关——ParallelGateway
并行网关,允许流程分成多条分支,也可以把多分支汇聚到一起,并行网关的功能是基于进入和外出顺序流的:
- fork分支:并行后的所有外出顺序流,为每个顺序流都创建一个并发分支
- join汇聚:所有到达并行网关,在此等待的分支,直到所有进入顺序流的分支都到达以后,流程就会通过汇聚网关。
注意:如果同一个并行网关有多个进入和多个外出顺序流,它就同时具有分支和汇聚功能,这时,网关会先汇聚所有进入的顺序流,然后再切分成多个并行分支。
与其他网关的主要区别是:并行网关不会解析条件,即使顺序流中定义了条件,也会被忽略。
并行网关需要所有分支的全部运行完了,才会汇聚,继续向下执行。
包含网关——InclusiveGateway
包含网关可以看成是排他网关和并行网关的结合体,和排他网关一样,可以在外出顺序流上定义条件,包含网关会解析它们,但是主要的区别是:包含网关可以选择多于一条顺序流,这和并行网关一样。
包含网关的功能是基于进入和外出顺序流的。
- 分支:所有外出顺序流的条件都会被解析,结果为true的顺序流会以并行方式继续执行,会为每一个顺序流创建一个分支。
- 汇聚:所有并行分支到达包含网关,会进入等待状态,直到每个包含流程token的进入顺序流的分支都到达。这是和并行网关最大的不同。
事件网关——EventGateway
Activiti和Spring的整合开发
配置文件:
Activiti和SpringBoot的整合开发
配置文件:
文章转载自公众号:码猿技术专栏
