目录
一,排他网关
排他网关(也叫异或(XOR)网关,或叫基于数据的排他网关),用来在流程中实现决策。 当流程 执行到这个网关,所有分支都会判断条件是否为 true,如果为 true 则执行该分支, 注意,排他网关只会选择一个为 true 的分支执行。(即使有两个分支条件都为 true,排他网关也会只 选择一条分支去执行)
为什么要用排他网关?
不用排他网关也可以实现分支,如下图:
上图中,在连线的 condition 条件上设置分支条件。 缺点: 如果条件都不满足,不使用排他网关,流程就结束了(是异常结束)。
如果 使用排他网关决定分支的走向,如下:
如果从网关出去的线所有条件都不满足则系统抛出异常。
org.activiti.engine.ActivitiException: No outgoing sequence flow of the exclusive gateway 'exclusivegateway1' could be selected for continuing the process at org.activiti.engine.impl.bpmn.behavior.ExclusiveGatewayActivityBehav ior.leave(ExclusiveGatewayActivityBehavior.java:85)
说明 :经过排他网关必须要有一条且只有一条分支走。
1.1 流程定义
1.3 测试
在部门经理审核后,走排他网关,从排他网关出来的分支有两条,一条是判断请假天数是否大于 3 天,另一条是判断请假天数是否小于等于 3 天。
设置分支条件时,如果所有分支条件都不是 true,报错: org.activiti.engine.ActivitiException: No outgoing sequence flow of the exclusive gateway 'exclusivegateway1' could be selected for continuing the process at org.activiti.engine.impl.bpmn.behavior.ExclusiveGatewayActivityBehavior.leave(ExclusiveGatewayActivit yBehavior.java:85)
二,并行网关
2.1 什么是并行网关
并行网关允许将流程分成多条分支,也可以把多条分支汇聚到一起,并行网关的功能是基于进 入和外出顺序流的:
fork 分支: 并行后的所有外出顺序流,为每个顺序流都创建一个并发分支。
join 汇聚: 所有到达并行网关,在此等待的进入分支, 直到所有进入顺序流的分支都到达以后, 流程就会通 过汇聚网关。
注意,如果同一个并行网关有多个进入和多个外出顺序流, 它就同时具有分支和汇聚功能。 这时, 网关会先汇聚所有进入的顺序流,然后再切分成多个并行分支。
与其他网关的主要区别是,并行网关不会解析条件。 即使顺序流中定义了条件,也会被忽略。
说明:
财务结算和入库是两个 execution 分支,在 act_ru_execution 表有两条记录分别是财务会计和行政考 勤,act_ru_execution 还有一条记录表示该流程实例。 待财务会计和行政考勤任务全部完成,在汇聚点汇聚,通过 parallelGateway 并行网关。 并行网关在业务应用中常用于会签任务,会签任务即多个参与者共同办理的任务。
2.2 流程定义
2.3 测试
当执行到并行网关数据库跟踪如下:
三,包含网关
什么是包含网关
包含网关可以看做是排他网关和并行网关的结合体。 和排他网关一样,你可以在外出顺序流上 定义条件,包含网关会解析它们。 但是主要的区别是包含网关可以选择多于一条顺序流,这和并行 网关一样。 包含网关的功能是基于进入和外出顺序流的:
分支: 所有外出顺序流的条件都会被解析,结果为 true 的顺序流会以并行方式继续执行, 会为每个顺序流>创建一个分支。
汇聚: 所有并行分支到达包含网关,会进入等待状态, 直到每个包含流程 token 的进入顺序流的分支都 到达。 这是与并行网关的最大不同。换句话说,包含网关只会等待被选中执行了的进入顺序流。 在 汇聚之后,流程会穿过包含网关继续执行。
3.1 流程定义
企业体检流程,公司全体员工进行常规项检查、抽血化验,公司管理层除常规检查和抽血化验还要 进行增加项检查。
员工类型:
通过流程变量 userType 来表示,如果等于 1 表示普通员工,如果等于 2 表示领导
注意:通过包含网关的每个分支的连线上设置 condition 条件。
3.2 测试
如果包含网关设置的条件中,流程变量不存在,报错; org.activiti.engine.ActivitiException: Unknown property used in expression: ${userType=='1' || userType=='2'} 需要在流程启动时设置流程变量 userType
当执行到包含网关: 流程实例执行表:SELECT * FROM act_ru_execution
小结:在分支时,需要判断条件,符合条件的分支,将会执行,符合条件的分支最终才进行汇聚。
四,课程总结
什么是工作流?
就是通过计算机对业务流程进行自动化管理,实现多个参与者按照预定义的流程去自动执行业务流 程。
什么 activiti?
Activiti 是一个工作流的引擎,开源的架构,基本 bpmn2.0 标准进行流程定义,它的是前身是 jbpm。 Activiti 通过是要嵌入到业务系统开发使用。 如何使用 activiti 开发? 第一步:部署 activiti 的环境。 环境包括:jar 包和数据库(25 张表) 业务系统通过 spring 和 activiti 整合进行开发。
如何使用 activiti 开发?
第一步:部署 activiti 的环境。 环境包括:jar 包和数据库(25 张表) 业务系统通过 spring 和 activiti 整合进行开发。
第二步:使用 activiti 提供流程设计器(和 idea 或 eclipse 集成的 designer)工具进行流程定义 流程定义生成两个文件:.bpmn 和.png(不是必须的)。
第三步;将流程定义文件部署到 activiti 的数据库 SELECT * FROM act_re_deployment #流程定义部署表 一次部署插入一条记录,记录流程定义的部署信息
SELECT * FROM act_re_procdef #流程定义表 一次部署流程定义信息,如果一次部署两个流程定义,插入两条记录 建议:一次部署只部署一个流程定义,这样 act_re_deployment 和 act_re_procdef 一对一关系
常用两个方法:单个文件部署和 zip 文件部署。 建议单个文件部署。
第四步: 启动一个流程实例 业务系统就可以按照流程定义去执行业务流程,执行前需要启动一个流程实例 根据流程定义来启动一个流程实例。 指定一个流程定义的 key 启动一个流程实例,activiti 根据 key 找最新版本的流程定义。 指定一个流程定义的 id 启动一个流程实例。 启动一个实例需要指定 businesskey(业务标识),businessKey 是 activiti 和业务系统整合时桥梁。 比如:请假流程,businessKey 就是请假单 id。 启动一个实例还可以指定流程变量,流程变量是全局变量(生命期是整个流程实例,流程实例结束, 变量就消失)
第五步:查询待办任务
查询个人任务:使用 taskService,根据 assignee 查询该用户当前的待办任务。 查询组任务:使用 taskService,根据 candidateuser 查询候选用户当前的待办组任务。
第六步:办理任务
办理个人任务:调用 taskService 的 complete 方法完成任务。 如果是组任务,需要先拾取任务,调用 taskService 的 claim 方法拾取任务,拾取任务之后组任务就 变成了个人任务(该任务就有负责人)。 网关: 排他网关:任务执行之后的分支,经过排他网关分支只有一条有效。 并行网关:任务执行后,可以多条分支,多条分支总会汇聚,汇聚完成,并行网关结束。 包含网关:是排他网关和并行网关结合体。