当前位置:网站首页>第六章: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
边栏推荐
猜你喜欢

什么是CRM决策分析管理?

IDEA performs the Test operation, resulting in duplicate data when data is inserted

Analysis and practice of antjian webshell dynamic encrypted connection

项目成本控制如何帮助项目成功?

mysql索引

Our Web3 Entrepreneurship Project, Yellow

three objects are arranged in a spherical shape around the circumference

IDEA执行Test操作导致数据插入时出现了重复数据

Science bosses say | Hong Kong rhubarb KaiBin teacher take you unlock the relationship between the matrix and 6 g

MySQL advanced (twenty-seven) database index principle
随机推荐
【MindSpore Easy-Diantong Robot-01】You may have seen many knowledge quiz robots, but this one is a bit different
C语言的高级用法
力扣(LeetCode)216. 组合总和 III(2022.08.04)
长达四年的减肥记录
js hijacks the array push method
无题十
How to realize the short press and long press detection of the button?
What is the function of the regular expression replaceFirst() method?
高质量 DeFi 应用构建指南,助力开发者玩转 DeFi Summer
手写柯里化 - toString 理解
three物体围绕一周呈球形排列
Technical dry goods | Hausdorff distance for image segmentation based on MindSpore
百年北欧奢华家电品牌ASKO智能三温区酒柜臻献七夕,共品珍馐爱意
技术干货 | 基于 MindSpore 实现图像分割之豪斯多夫距离
我们的Web3创业项目,黄了
使用工具类把对象中的null值转换为空字符串(集合也可以使用)
IO流篇 -- 基于io流实现文件夹拷贝(拷贝子文件夹及子文件夹内文件)满满的干货
浅析WSGI协议
企业的数字化转型到底是否可以买来?
Meteorological data processing example - matlab string cutting matching and R language date matching (data splicing)