当前位置:网站首页>第六章: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
边栏推荐
- Marketing Suggestions | You have an August marketing calendar to check! Suggest a collection!
- Is digital transformation a business buy-in?
- Complete image segmentation efficiently based on MindSpore and realize Dice!
- The difference between find, matches, lookingAt matching strings in matcher
- three物体围绕一周呈球形排列
- Meteorological data processing example - matlab string cutting matching and R language date matching (data splicing)
- After Keil upgrades to AC6, what changes?
- 无题十二
- 基于MindSpore高效完成图像分割,实现Dice!
- IO流篇 -- 基于io流实现文件夹拷贝(拷贝子文件夹及子文件夹内文件)满满的干货
猜你喜欢

手把手教你纯c实现异常捕获try-catch组件

皕杰报表的下拉框联动

hcip BGP enhancement experiment

Microservice Technology Stack

DFINITY 基金会创始人谈熊市沉浮,DeFi 项目该何去何从

还在找网盘资源吗?快点收藏如下几个值得收藏的网盘资源搜索神器吧!

After Keil upgrades to AC6, what changes?

SD NAND Flash简介!

Marketing Suggestions | You have an August marketing calendar to check! Suggest a collection!

气象数据数据处理实例——matlab字符串切割匹配与R语言日期匹配(数据拼接)
随机推荐
语音社交软件开发——充分发挥其价值
浅析WSGI协议
手写柯里化 - toString 理解
Egg framework usage (1)
Where is your most secretive personality?
Seata source code analysis: initialization process of TM RM client
IDEA执行Test操作导致数据插入时出现了重复数据
Development common manual link sharing
Four years of weight loss record
The difference between find, matches, lookingAt matching strings in matcher
一文道清什么是SPL
我们的Web3创业项目,黄了
The technological achievements of Shanghai Konan were selected into the "2021 Shanghai Network Security Industry Innovation Research Achievement Catalog" by the Municipal Commission of Economy and Inf
高质量 DeFi 应用构建指南,助力开发者玩转 DeFi Summer
【zeno】为zeno增加子模块/新节点的最小化的例子
5.部署web项目到云服务器
2022.8.3
技术干货 | 基于 MindSpore 实现图像分割之豪斯多夫距离
mysql索引
还在找网盘资源吗?快点收藏如下几个值得收藏的网盘资源搜索神器吧!