当前位置:网站首页>第六章:activiti流程分流判断之排它网关和并行网关
第六章:activiti流程分流判断之排它网关和并行网关
2022-08-05 10:05:00 【全栈程序员站长】
大家好,又见面了,我是你们的朋友全栈君。
专栏上一章简单介绍了通过判断分流走不同的任务节点。下面我们介绍一下比较复杂的一点的判断。
排它网关:具有排它性,根据条件只能走一天线路,比如请假有班主任审批,班长审批,年级主任审批,这三个只能走一个,这就是排它性。
下面我们复制一个请假流程图:
首先介绍怎么中间的叉号图,叉号即网关,所以找到右侧工具栏的gateway,
改好后我们看三条判断的先,leave days<3表示请假小于3天的走的流程,对应下图:
leave days<7表示小于请假小于7天,大于三天,对应下图:
剩余的一天,对应下图,
注意上图的condition的判断条件为空,这就是排它性,其他的两个条件不满足,自然就走这个条件了,不过这里我们还要设置一下,叉号默认走的流程:
flow9就是leave days>7的id.
最后我们点击流程图空白处设置流程id,为:studentLeaveProcess03:
保存,这样就好了。
下面测试:
复制一个流程类:
复制之前的代码,稍作修改如下:
package com.xiaoyexinxixn.ActivityLesson.flow;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;
import com.xiaoyexinxixn.ActivityLesson.model.Student;
public class StudentLeaveProcess3 {
//获取默认流程引擎实例,会自动读取activiti.cfg.xml ,所以我们要严格定义配置文件的名称
private ProcessEngine processEngine =ProcessEngines.getDefaultProcessEngine();
/**
* 部署流程定义
*/
@Test
public void deploy() {
//获取部署相关service,这些都是activiti封装好的api接口,还有很多,下面也会用到很多
Deployment deployment=processEngine.getRepositoryService()
//创建部署
.createDeployment()
//加载流程图资源文件
.addClasspathResource("diagrams/StudentLeave3.bpmn")
//加载流程图片
.addClasspathResource("diagrams/StudentLeave3.png")
//流程名称
.name("leave02")
//部署流程
.deploy();
System.out.println("流程部署的ID: "+deployment.getId());
System.out.println("流程部署的Name: "+deployment.getName());
}
/*
* 启动流程实例
*/
@Test
public void start(){
//运行启动流程的servicee
ProcessInstance pi=processEngine.getRuntimeService()
//定义流程表的KEY字段值,key值是我们前面定义好的key,可在act_re_procdef表中的key_字段中找到,
.startProcessInstanceByKey("studentLeaveProcess03");
System.out.println(pi.getId());
System.out.println(pi.getProcessDefinitionId());
}
}
运行程序,部署流程,启动流程,
下面让流程走到leave002节点,下面做判断:
/**
* 完成任务时设置流程变量
*/
@Test
public void completeTaskVariablesTest(){
Map<String, Object> variables=new HashMap<String,Object>();
variables.put("days", 1);
processEngine.getTaskService().complete("87504",variables);
}
这里我们先请假一天,看看走哪个流程:
任务表进入了leave002,说明没问题。
然后跑完流程,我们再测试days=4时走哪个;
启动流程一个新的流程:
@Test
public void completeTaskVariablesTest(){
Map<String, Object> variables=new HashMap<String,Object>();
variables.put("days", "4");
processEngine.getTaskService().complete("100004",variables);
}
说明是没有问题。
下面我们介绍并行网关:
上图就存在leave002和leave003同时进行的审批流程,并行审批不常用,但是淘宝上,我们购买一件商品,确认付款后,的付款流程和发货流程是同时进行的。
这里我们先画个上面的图,这里中间的两个加号是在工具栏中的geteway的:
然后把流程的id改为4:
这样就画好了:
测试代码:
package com.xiaoyexinxixn.ActivityLesson.flow;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;
import com.xiaoyexinxixn.ActivityLesson.model.Student;
public class StudentLeaveProcess4 {
//获取默认流程引擎实例,会自动读取activiti.cfg.xml ,所以我们要严格定义配置文件的名称
private ProcessEngine processEngine =ProcessEngines.getDefaultProcessEngine();
/**
* 部署流程定义
*/
@Test
public void deploy() {
//获取部署相关service,这些都是activiti封装好的api接口,还有很多,下面也会用到很多
Deployment deployment=processEngine.getRepositoryService()
//创建部署
.createDeployment()
//加载流程图资源文件
.addClasspathResource("diagrams/StudentLeave6.bpmn")
//加载流程图片
.addClasspathResource("diagrams/StudentLeave6.png")
//流程名称
.name("leave06")
//部署流程
.deploy();
System.out.println("流程部署的ID: "+deployment.getId());
System.out.println("流程部署的Name: "+deployment.getName());
}
/*
* 启动流程实例
*/
@Test
public void start(){
//运行启动流程的servicee
ProcessInstance pi=processEngine.getRuntimeService()
//定义流程表的KEY字段值,key值是我们前面定义好的key,可在act_re_procdef表中的key_字段中找到,
.startProcessInstanceByKey("studentLeaveProcess06");
System.out.println(pi.getId());
System.out.println(pi.getProcessDefinitionId());
}
}
部署流程,启动流程实例,
流程到leave001:
执行完成任务:
现在任务表有两个任务了,说明任务同时接受上一节点的任务。
接着先完成leave003的任务:
任务表还有一条数据,
这里要说一下,既然是并行任务就要两个任务都结束才能进入到下一个节点。否则完成了一个。另外一个就一直处于等待状态。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/106141.html原文链接:https://javaforall.cn
边栏推荐
- STM32+ULN2003驱动28BYJ4步进电机(根据圈数正转、反转)
- 2022.8.3
- Analysis and practice of antjian webshell dynamic encrypted connection
- MySQL data view
- 我们的Web3创业项目,黄了
- Bias lock/light lock/heavy lock lock is healthier. How is locking and unlocking accomplished?
- MySQL advanced (twenty-seven) database index principle
- [Office] Collection of Microsoft Office download addresses (offline installation and download of Microsoft's official original version)
- 项目成本控制如何帮助项目成功?
- IDEA performs the Test operation, resulting in duplicate data when data is inserted
猜你喜欢
随机推荐
Brief Analysis of WSGI Protocol
Four years of weight loss record
Custom filters and interceptors implement ThreadLocal thread closure
手把手教你纯c实现异常捕获try-catch组件
无题五
STM32+ULN2003驱动28BYJ4步进电机(根据圈数正转、反转)
Technical dry goods | Hausdorff distance for image segmentation based on MindSpore
Pytorch Deep Learning Quick Start Tutorial -- Mound Tutorial Notes (3)
19. Server-side session technology Session
PAT Grade B-B1020 Mooncake(25)
How to realize the short press and long press detection of the button?
基于MindSpore高效完成图像分割,实现Dice!
Jenkins使用手册(2) —— 软件配置
2022.8.3
IO流篇 -- 基于io流实现文件夹拷贝(拷贝子文件夹及子文件夹内文件)满满的干货
JS逆向入门学习之回收商网,手机号码简易加密解析
无题十一
Oracle temporary table space role
你最隐秘的性格在哪?
Wei Dongshan Digital Photo Frame Project Learning (6) Transplantation of tslib