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

Keil升级到AC6后,到底有哪些变化?

创建一个 Dapp,为什么要选择波卡?

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

数据中台建设(十):数据安全管理

What is SPL?

Our Web3 Entrepreneurship Project, Yellow

Custom filters and interceptors implement ThreadLocal thread closure

dotnet OpenXML parsing PPT charts Getting started with area charts

MySQL事务

Marketing Suggestions | You have an August marketing calendar to check! Suggest a collection!
随机推荐
技术干货 | 基于 MindSpore 实现图像分割之豪斯多夫距离
What is CRM Decision Analysis Management?
2022 Huashu Cup Mathematical Modeling Ideas Analysis and Exchange
hcip BGP enhancement experiment
21 Days of Deep Learning - Convolutional Neural Networks (CNN): Clothing Image Classification (Day 3)
入门 Polkadot 平行链开发,看这一篇就够了
【Unity】【UGUI】【在屏幕上显示文本】
自定义过滤器和拦截器实现ThreadLocal线程封闭
一文道清什么是SPL
Pycharm 常用外部工具
长达四年的减肥记录
Can MySQL use aggregate functions without GROUP BY?
mysql进阶(二十七)数据库索引原理
CPU的亲缘性affinity
Why are RELTABLESPACE values 0 for many tables displayed in sys_class?
Where is your most secretive personality?
无题八
PHP 操作mangoDb
你最隐秘的性格在哪?
leetcode: 529. Minesweeper Game