activiti入门3排他网关,并行网管,包括网关,事件网关
网关用来控制流程的流向 网关能够消费也能够生成token。
网关显示成菱形图形,内部有有一个小图标。 图标表示网关的类型。
基本分支
首先 利用 流程变量 写个带有分支的一个基本流程
流程图:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTY3NDc0NTA2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
部署流程文件:
//获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); @Test
public void deployFlow(){ //获取仓库服务对象
RepositoryService repositoryService = processEngine.getRepositoryService(); InputStream in = this.getClass().getResourceAsStream("/MyProcess11.zip");
ZipInputStream zipInputStream = new ZipInputStream(in); Deployment dm = repositoryService.createDeployment()
.name("学生请假")
.addZipInputStream(zipInputStream)
.deploy(); System.out.println("id:"+dm.getId()+",name:"+dm.getName());
}
启动流程 并 设置请假天数为 3天的 流程变量 提交
/**
* 启动流程 并完毕 提交
*/
@Test
public void startProcessAndComp(){ RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance pi = runtimeService.startProcessInstanceByKey("leave"); System.out.println("id:"+pi.getId()+",流程实例ID:"+pi.getProcessInstanceId()+",流程定义ID:"+pi.getProcessDefinitionId()); TaskService taskService = processEngine.getTaskService(); //通过流程实例ID获取任务对象
Task task = taskService.createTaskQuery()
.processInstanceId(pi.getProcessInstanceId())
.singleResult();
System.out.println("taskID:"+task.getId()+",name:"+task.getName()); Map<String, Object> paramMap = new HashMap<String, Object>();
//设置流程变量day=3
paramMap.put("day", 3);
//提交任务的时候传入流程变量
taskService.complete(task.getId(), paramMap); //查询任务
task = taskService.createTaskQuery()
.processInstanceId(pi.getProcessInstanceId())
.singleResult(); //假设任务对象为空,则流程运行结束
if (task != null) {
System.out.println("taskID:"+task.getId()+",name:"+task.getName());
} else {
System.out.println("任务运行完毕");
}
}
最后的执行结果:
id:1501,流程实例ID:1501,流程定义ID:leave:2:1404
taskID:1504,name:班主任
任务运行完成
我们能够再数据库中查看:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTY3NDc0NTA2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTY3NDc0NTA2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
我们再部署一个 流程文件 , 而且在提交 任务的时候 设置流程变量 请假天数为 10天
最后的执行结果
id:1701,流程实例ID:1701,流程定义ID:leave:3:1604
taskID:1704,name:班主任
taskID:1707,name:年级主任
如今 流程就到了另外 一条线
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTY3NDc0NTA2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
年纪主任审批通过:
/**
* 提交任务
*/
@Test
public void completeTask(){
TaskService taskService = processEngine.getTaskService();
taskService.complete("1707");
}
流程运行结束
排他网关:
排他网关描写叙述
排他网关(也叫异或(XOR)网关,或更技术性的叫法 基于数据的排他网关), 用来在流程中实现决策。 当流程运行到这个网关,全部外出顺序流都会被处理一遍。 当中条件解析为true的顺序流(或者没有设置条件,概念上在顺序流上定义了一个'true')
会被选中,让流程继续执行。
注意这里的外出顺序流 与BPMN 2.0通常的概念是不同的。
通常情况下,全部条件结果为true的顺序流 都会被选中。以并行方式运行。但排他网关仅仅会选择一条顺序流运行。 就是说,尽管多个顺序流的条件结果为true。 那么XML中的第一个顺序流(也仅仅有这一条)会被选中,并用来继续运行流程。
假设没有选中不论什么顺序流。会抛出一个异常。
排他网关图形
排他网关显示成一个普通网关(比方。菱形图形), 内部是一个“X”图标,表示异或(XOR)语义。
注意。没有内部图标的网关,默觉得排他网关。 BPMN 2.0规范不同意在同一个流程定义中同一时候使用没有X和有X的菱形图形。

流程文件:
排他网关有个默认的选项 default flow , 当 default flow 设定后 就不用设置表达式了, 假设全部的条件都不通过 就会运行默认的流程
年级主任审批和校长审批
首先 还是 先把文件部署
//获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); @Test
public void deployFlow2(){ //获取仓库服务对象
RepositoryService repositoryService = processEngine.getRepositoryService(); InputStream in = this.getClass().getResourceAsStream("/exclusiveGateway.zip");
ZipInputStream zipInputStream = new ZipInputStream(in); Deployment dm = repositoryService.createDeployment()
.name("学生请假")
.addZipInputStream(zipInputStream)
.deploy(); System.out.println("id:"+dm.getId()+",name:"+dm.getName());
}
启动流程, 并提交 设置 请假天数 为 10天 结果
id:2001,流程实例ID:2001,流程定义ID:exclusiveGateWay:1:1904
taskID:2004,name:学生请假
taskID:2008,name:年级主任审批
再 又一次部署一个流程文件 然后启动 提交 设置请假天数为 30天 运行结果
id:2201,name:学生请假
id:2301,流程实例ID:2301,流程定义ID:exclusiveGateWay:2:2204
taskID:2304,name:学生请假
taskID:2308,name:校长审批
最后在 部署一遍, 这次设置请假天数为 3天 结果
id:2501,name:学生请假
id:2601,流程实例ID:2601,流程定义ID:exclusiveGateWay:3:2504
taskID:2604,name:学生请假
taskID:2608,name:班主任审批
这里 流程走到了 当初 默认的设置 班主任审批
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTY3NDc0NTA2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
当我们设置了 默认 的 配置 ,即使没有 设置表达式 流程 条件都 不满足的时候 都会运行默认的
并行网关
并行网关描写叙述
网关也能够表示流程中的并行情况。最简单的并行网关是 并行网关,它同意将流程 分成多条分支。也能够把多条分支 汇聚到一起。 of execution.
并行网关的功能是基于进入和外出的顺序流的:
分支: 并行后的全部外出顺序流,为每一个顺序流都创建一个并发分支。
汇聚: 全部到达并行网关。在此等待的进入分支。 直到全部进入顺序流的分支都到达以后。 流程就会通过汇聚网关。
注意。假设同一个并行网关有多个进入和多个外出顺序流。 它就同一时候具有分支和汇聚功能。 这时。网关会先汇聚全部进入的顺序流,然后再切分成多个并行分支。
与其它网关的主要差别是,并行网关不会解析条件。
即使顺序流中定义了条件。也会被忽略。
并行网关图形
并行网关显示成一个普通网关(菱形)内部是一个“加号”图标, 表示“与(AND)”语义。
首先 画一个简单的并行流程
注意 并行 网关 要有2个 一个是用于 分支 一个用于 聚合
部署启动
@Test
public void deployFlow3() { // 获取仓库服务对象
RepositoryService repositoryService = processEngine
.getRepositoryService(); InputStream in = this.getClass().getResourceAsStream("/Parallel.zip");
ZipInputStream zipInputStream = new ZipInputStream(in); Deployment dm = repositoryService.createDeployment().name("并行网关")
.addZipInputStream(zipInputStream).deploy(); System.out.println("id:" + dm.getId() + ",name:" + dm.getName()); RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance pi = runtimeService
.startProcessInstanceByKey("parallel"); System.out.println("id:" + pi.getId() + ",流程实例ID:"
+ pi.getProcessInstanceId() + ",流程定义ID:"
+ pi.getProcessDefinitionId()); }
id:2801,name:并行网关
id:2901,流程实例ID:2901,流程定义ID:parallel:1:2804
此时流程进入 启动项目环节 通过流程实例ID 查看当前流程 进度
/**
* 启动流程 并完毕 提交
*/
@Test
public void startProcessAndComp3() { TaskService taskService = processEngine.getTaskService(); // 查询任务
Task task = taskService.createTaskQuery().processInstanceId("2901").singleResult(); // 假设任务对象为空,则流程运行结束
if (task != null) {
System.out.println("taskID:" + task.getId() + ",name:"
+ task.getName());
} else {
System.out.println("任务运行完毕");
} // 通过流程实例ID获取任务对象
task = taskService.createTaskQuery().processInstanceId("2901").singleResult();
System.out.println("taskID:" + task.getId() + ",name:" + task.getName()); // 提交任务
taskService.complete(task.getId()); }
taskID:2904,name:项目启动
taskID:2904,name:项目启动
提交任务后,流程进入并行环节,同一时候运行 功能模块1 和 功能模块2
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTY3NDc0NTA2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
这是我们能够看到 流程实例ID 和 运行对象ID 已经是不同了
这个是 act_ru_execution 表的数据
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTY3NDc0NTA2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
我们先 提交一个 功能模块1的任务
在看 任务表 act_ru_task
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTY3NDc0NTA2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
此时 任务表 仅仅有 功能模块2
我们在看 act_ru_execution 这个表 依然是3条数据 功能模块1 的运行流程 被堵塞在 并行网关这里 没有进入 測试公布这个 环节
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTY3NDc0NTA2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
在提交功能模块2 任务
查看 这 2个表
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTY3NDc0NTA2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
流程 已经 进入 下一个环节
提交最后一个人 整个流程结束, 我们在查看 历史活动表 act_hi_actinst
整个流程 分成了 2 块
包括网关
包括网关描写叙述
包括网关能够看做是排他网关和并行网关的结合体。 和排他网关一样,你能够在外出顺序流上定义条件。包括网关会解析它们。 可是基本的差别是包括网关能够选择多于一条顺序流。这和并行网关一样。
包括网关的功能是基于进入和外出顺序流的:
分支: 全部外出顺序流的条件都会被解析。结果为true的顺序流会以并行方式继续运行。 会为每一个顺序流创建一个分支。
汇聚: 全部并行分支到达包括网关。会进入等待章台, 直到每一个包括流程token的进入顺序流的分支都到达。 这是与并行网关的最大不同。换句话说,包括网关仅仅会等待被选中运行了的进入顺序流。 在汇聚之后,流程会穿过包括网关继续运行。
注意,假设同一个包括节点拥有多个进入和外出顺序流。 它就会同一时候含有分支和汇聚功能。
这时,网关会先汇聚全部拥有流程token的进入顺序流。 再依据条件推断结果为true的外出顺序流,为它们生成多条并行分支。
包括网关图形
并行网关显示为一个普通网关(菱形),内部包括一个圆圈图标。
当 main config 中的 表达式 条件返回的结果为真时 运行 并行网关
结果为假时 运行 排他任务
详细的 流程 这里就不介绍了
事件网关
事件网关描写叙述
基于事件网关同意依据事件推断流向。
网关的每一个外出顺序流都要连接到一个中间捕获事件。 当流程到达一个基于事件网关,网关会进入等待状态:会暂停运行。 与此同一时候,会为每一个外出顺序流创建相对的事件订阅。
注意基于事件网关的外出顺序流和普通顺序流不同。这些顺序流不会真的"运行"。
相反。它们让流程引擎去决定运行到基于事件网关的流程须要订阅哪些事件。
要考虑下面条件:
基于事件网关必须有两条或以上外出顺序流。
基于事件网关后,仅仅能使用
intermediateCatchEvent
类型。 (activiti不支持基于事件网关后连接ReceiveTask。)连接到基于事件网关的
intermediateCatchEvent
仅仅能有一条进入顺序流。
事件网关图形
事件网关和其它BPMN网关一样显示成一个菱形, 内部包括指定图标。
这里 事件 太多了 就 先到这里 0.0
activiti入门3排他网关,并行网管,包括网关,事件网关的更多相关文章
- activiti入门3排他网关,并行网管,包含网关,事件网关(转)
网关用来控制流程的流向 网关可以消费也可以生成token. 网关显示成菱形图形,内部有有一个小图标. 图标表示网关的类型. 基本分支 首先 利用 流程变量 写个带有分支的一个基本流程 流程图: 部署 ...
- Activiti入门 -- 环境搭建和核心API简介
相关文章: <史上最权威的Activiti框架学习指南> <Activiti入门 -- 轻松解读数据库> 本章内容,主要讲解Activiti框架环境的搭建,能够使用Activi ...
- Activiti7 网关(并行网关)
什么是并行网关? 并行网关允许将流程分成多条分支,也可以将多条分支合并到一起,并行网关是基于进入和外出顺序流的 fork分支: 并行后的所有外出顺序流,为每个顺序流都创建一个并发分支 jion汇聚: ...
- 阿里云API网关(11)外网访问 阿里云API网关内定义的API步骤:
网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...
- Activiti入门 -- 轻松解读数据库
相关文章: <史上最权威的Activiti框架学习指南> <Activiti入门 --环境搭建和核心API简介> 在Activiti中,相对前身JBPM基础上又额外多了5张,框 ...
- BME200加密网关,在电力与工业应用的加密网关设计与介绍
加密通信网关,顾名思义就是带加密的通信网关终端, 一般业内主是需用到是工业通信关行业的为主的.,BME200加密通信网关,主要电力和工业互联网相关领域开发的一款加密通信网关. 为什么出现加密网关 1 ...
- Activiti网关--并行网关
1.什么是并行网关 并行网关允许将流程分成多条分支,也可以把多条分支汇聚到一起,并行网关的功能是基于进 入和外出顺序流的: fork 分支: 并行后的所有外出顺序流,为每个顺序流都创建一个并发分支. ...
- activiti实战系列 排他网关(ExclusiveGateWay)
流程图 12.2:部署流程定义+启动流程实例 12.3:查询我的个人任务 12.4:完成我的个人任务 说明: 1) 一个排他网关对应一个以上的顺序流 2) 由排他网关流出的顺序流都有个 ...
- Python爬虫入门教程 4-100 美空网未登录图片爬取
美空网未登录图片----简介 上一篇写的时间有点长了,接下来继续把美空网的爬虫写完,这套教程中编写的爬虫在实际的工作中可能并不能给你增加多少有价值的技术点,因为它只是一套入门的教程,老鸟你自动绕过就可 ...
随机推荐
- ASP.NET MVC中DropDownList的使用
Asp.net MVC中的DropDownLists貌似会让一开始从Asp.net Forms转过来的程序员造成不少迷惑.这篇文章讲述了为了使用DropDownLists,你需要在Asp.Net MV ...
- Django使用普通表单、Form、以及modelForm操作数据库方式总结
Django使用普通表单.Form.以及modelForm操作数据库主要应用于增删该查的情景下,流程通用如下,只是实现方式不一样: 进入填写表单页面: 在表单页面填写信息,并提交: 表单数据验证 验证 ...
- LaTeX需要renewcommand的地方
发现了两篇关于\renewcommand的文章,希望大家有更好的建议,请多多指教! 文章来源:http://blog.csdn.net/loveaborn/article/details/915205 ...
- HDU 1285 确定比赛名次【字典序最小的拓扑排序 + 优先队列】
确定比赛名次 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
- 2018 ACM-ICPC 南京网络赛
Problem A Problem B Problem C Problem D Problem E Problem F Problem G Problem H Problem I Problem J ...
- Milk Pails(BFS)
Milk Pails 时间限制: 1 Sec 内存限制: 64 MB提交: 16 解决: 4[提交][状态][讨论版] 题目描述 Farmer John has received an order ...
- Maven与Nexus OSS
Maven 是一个项目管理和构建自动化工具,是Apache Fundation下的一个Java项目.常用于Java项目中依赖管理 下载直接去官网 安装Maven 已经编译的二进制包 直接解压到安装目录 ...
- create table select from
CREATE TABLE new_table AS SELECT * FROM old_table
- small test on 5.30 night T2
(题面写错了,应该是一条从b -> a 的边) 让我们设状态 (a,b,c) 表示存在一个点k,使得 dist(k,b) - dist(k,a) * 2 + 3 = c,显然这里的第三维可以压 ...
- 【权值分块】bzoj1503 [NOI2004]郁闷的出纳员
权值分块,离散化非常蛋疼,只能离散化搞…… 需要支持操作:删除<=某个值得所有权值==打标记 O(sqrt(n)) 码长和我的平衡树差不多……速度快3倍左右. #include<cstdi ...