工作流(WorkFlow),就是通过计算机对业务流程自动化执行管理,它主要解决的是“使在多个参与者之间按照某种预定义的规则自动进行传递文档、信息或者任务的过程,从而实现某个预期的业务目标,或者促使此目标的实现”。
工作流引擎是一种按照预定义规则【需要符合BPMN规范】进行部署,将业务和节点的流程进行分离【特定形式进行关联】,实现节点的自动流程的工作流框架,BPMN规范可以理解为就是一个画流程图的规范。
Activiti7是一个工作流引擎,activiti可以将业务系统中复杂的业务流程抽取出来,使用专门的建模语言(BPMN2.0)进行定义,业务系统按照预先定义的流程进行执行,实现了业务系统的业务流程由activiti进行管理,减少业务系统由于流程变更进行系统升级改造的工作量,从而提高系统的健壮性,同时也减少了系统开发维护成本
没有工作流引擎之前如果要控制业务流程我们可能通过改变某个字段的状态来实现,这会带来一旦我们流程发生变化的时候我们就需要去同步修改代码。而流程引擎呢它里面内嵌了25张表,我们只要读取它里面的表就可以了,与表对应的它还提供可一系列操作表的接口。核心一个类是ProcessEngine,通过它能获取一系列的service接口;
1.画图
2.部署
3.调接口
需要将预定于的流程文件BPMN部署到工作流引擎中,会把节点、路径信息存储到数据库中
工作流引擎提供了大量的API对流程进行查询处理,细节都是对应用程序屏蔽的,大大提高了开发效率
业务逻辑的处理和流程的流转是分离的,是通过BusinessKey进行关联的;
1.业务流程图要规范化,需要遵守一套标准;
2.业务流程图本质上就是一个XML文件,而XML可以存放所要的数据;
3.读取流程图的过程其实就是解析XML文件的过程;
4.读取一个业务流程图的节点就相当于解析一个XML的节点,进一步将数据插入到MySQL表中,形成一条记录;
5.将一个业务流程图的所有节点都读取并存入到MySQL表中;
6.后面只要读取MySQL表中的记录就相当于读取业务流程图的一个节点;
7.业务流程的推进,后面就转换为读取表中的数据,并且处理数据,结束的时候这一行的数据就可以删除了;
1.整合Activiti7---->依赖和配置文件;
2.业务流程建模---->图片以及文件;
3.部署业务流程---->RepostoryService;
4.启动流程实例---->RuntimeService;
5.查询待办对象---->taskService
6.处理待办任务---->taskService
先将下一个节点的数据加入到历史任务以及运行时任务
更新旧任务在历史表中的结束时间,再删除运行时的旧任务;
7.结束流程
注意:方法中只要带有native的都是自己写sql语句
1.也是一样的需要获取流程引擎对象;
2.通过引擎对象获取对象的实例对象;
3.通过实例对象的相关条件相关的方法获取流程定义集合;
注意:因为涉及到下载、删除,因此需要指定是什么资源,所以需要通过部署ID来进行操作
因此在集合里面找到我们指定的流程资源,再获取到部署ID来进行操作;
可以把流程定义看做是一个类,而流程实例就是这个类的实例对象
1.流程定义:是一个符合BPMN2.0规范的一个流程图文件;
2.流程实例:基于流程定义所创建的正在进行中的审核流程;
- 流程变量在Activiti7中是一个非常重要的角色,流程运转时需要靠流程变量,业务系统和Activiti7结合时少不了流程变量,流程变量就是Activiti在管理工作流时根据管理需要而设置的变量;
- 比如在请假流程时,如果请假天数>3天则需要总经理审批,否则由人事直接审批,那么请假天数就可以设置流程变量,在流程流转的时候使用;
在变量上面使用UEL表达式,类似于EL表达式(也就是在任务节点上)
在连线上面使用UEL表达式,也就是一个任务节点之后可能根据不同的条件会有不同的分支节点可以走,这里也就是在连线上面进行判断,这个时候UEL表达式结果必须是布尔类型,例如:${day>3};
- global变量:流程变量的作用域范围默认值是流程实例,作用域范围最大;
- local变量:流程变量的作用域范围如果仅仅针对一个任务或一个任务实例,那么作用域范围没有流程实例大;
如果一个流程每个节点只有一个审核人,那么效率就会变得非常缓慢,因此需要候选人;
怎么做?
1.在流程图中可以设置多个候选人;
2.启动实例的时候将候选人设置进去;
3.根据候选人的名字去处理任务(问题:如果有多个候选人那么就可能会造成并发的问题,也就是多个候选人同时来处理同一个任务);
4.因此应该让候选人去领取指定任务(claim方法),领取之后其他候选人就不能再处理该任务;
一个流程进来之后可能有很多分支,可能去到A分支也可能去到B分支,这个时候加上网关,由网关来决定它究竟去到哪一个分支;
例如我们之前在连线使用流程变量时,根据不同的条件进入到不同的节点,但是如果条件都满足的情况下就都会进入,这样显然是不符合我们的需求的,因此我们使用网关可以解决这个问题
使用网关就是当条件都满足的时候只会走其中一个,而走的这一个是按照任务被创建的需要的顺序来访问;
排他网关
排他网关(异或网关或基于数据的排他网关),用来在流程中实现决策,当流程执行到这个网关的时候,所有分支都会判断条件是否为true,如果为true则执行该分支
并行网关
并行网关允许将流程分成多条分支,也可以把多条分支汇聚到一起,并行网关的功能是基于进入和外出的顺序流的,这些分支结果必须都为true才会通过,在分支的外面会聚合起来到另外一个并行网关,这个出口处的并行网关就会判断所有的分支结果是否为true,如果都为true才会给到下个节点;
包含网关
包含网关可以看做是排他网关和并行网关的结合体
例如需求:出差申请大于3天需要由项目经理审批,小于等于三天右技术经理审批,出差申请必须经过人事助理审批;
是什么?
BusinessKey业务标识,通常为业务表的主键,业务标识和流程实例一一对应,业务标识来源于业务系统,存储业务标识就是根据业务标识来关联业务系统的数据;
简单来说就是在数据库中流程实例都会绑定一个BusinessKey
而这个BusinessKey是另外一张表的主键,在这张表中就存储了该流程实例的相关业务信息;
为什么?
例如我们在申请请假的时候会填写请假原因和请假时间,而业务标识就是将这些信息绑定到流程中的;
怎么做?
封装一个类用来创建业务对象,例如:请假时间,请假原因;
在任务处理中获取流程实例对象的业务标识;