activiti入门3排他网关,并行网管,包含网关,事件网关(转)
网关用来控制流程的流向 网关可以消费也可以生成token。
网关显示成菱形图形,内部有有一个小图标。 图标表示网关的类型。
基本分支
首先 利用 流程变量 写个带有分支的一个基本流程
流程图:
部署流程文件:
- //获取流程引擎
- 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:班主任
- 任务执行完毕
我们可以再数据库中查看:
我们再部署一个 流程文件 , 并且在提交 任务的时候 设置流程变量 请假天数为 10天
最后的运行结果
- id:1701,流程实例ID:1701,流程定义ID:leave:3:1604
- taskID:1704,name:班主任
- taskID:1707,name:年级主任
现在 流程就到了另外 一条线
年纪主任审批通过:
- /**
- * 提交任务
- */
- @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:班主任审批
这里 流程走到了 当初 默认的设置 班主任审批
当我们设置了 默认 的 配置 ,即使没有 设置表达式 流程 条件都 不满足的时候 都会执行默认的
并行网关
并行网关描述
网关也可以表示流程中的并行情况。最简单的并行网关是 并行网关,它允许将流程 分成多条分支,也可以把多条分支 汇聚到一起。 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
这是我们可以看到 流程实例ID 和 执行对象ID 已经是不同了
这个是 act_ru_execution 表的数据
我们先 提交一个 功能模块1的任务
在看 任务表 act_ru_task
此时 任务表 只有 功能模块2
我们在看 act_ru_execution 这个表 依旧是3条数据 功能模块1 的执行流程 被阻塞在 并行网关这里 没有进入 测试发布这个 环节
在提交功能模块2 任务
查看 这 2个表
流程 已经 进入 下一个环节
提交最后一个人 整个流程结束, 我们在查看 历史活动表 act_hi_actinst
整个流程 分成了 2 块
包含网关
包含网关描述
包含网关可以看做是排他网关和并行网关的结合体。 和排他网关一样,你可以在外出顺序流上定义条件,包含网关会解析它们。 但是主要的区别是包含网关可以选择多于一条顺序流,这和并行网关一样。
包含网关的功能是基于进入和外出顺序流的:
分支: 所有外出顺序流的条件都会被解析,结果为true的顺序流会以并行方式继续执行, 会为每个顺序流创建一个分支。
汇聚: 所有并行分支到达包含网关,会进入等待章台, 直到每个包含流程token的进入顺序流的分支都到达。 这是与并行网关的最大不同。换句话说,包含网关只会等待被选中执行了的进入顺序流。 在汇聚之后,流程会穿过包含网关继续执行。
注意,如果同一个包含节点拥有多个进入和外出顺序流, 它就会同时含有分支和汇聚功能。 这时,网关会先汇聚所有拥有流程token的进入顺序流, 再根据条件判断结果为true的外出顺序流,为它们生成多条并行分支。
包含网关图形
并行网关显示为一个普通网关(菱形),内部包含一个圆圈图标。
当 main config 中的 表达式 条件返回的结果为真时 执行 并行网关
结果为假时 执行 排他任务
具体的 流程 这里就不介绍了
事件网关
事件网关描述
基于事件网关允许根据事件判断流向。网关的每个外出顺序流都要连接到一个中间捕获事件。 当流程到达一个基于事件网关,网关会进入等待状态:会暂停执行。 与此同时,会为每个外出顺序流创建相对的事件订阅。
注意基于事件网关的外出顺序流和普通顺序流不同。这些顺序流不会真的"执行"。 相反,它们让流程引擎去决定执行到基于事件网关的流程需要订阅哪些事件。 要考虑以下条件:
基于事件网关必须有两条或以上外出顺序流。
基于事件网关后,只能使用
intermediateCatchEvent类型。 (activiti不支持基于事件网关后连接ReceiveTask。)连接到基于事件网关的
intermediateCatchEvent只能有一条进入顺序流。
事件网关图形
事件网关和其他BPMN网关一样显示成一个菱形, 内部包含指定图标。
转自:http://blog.csdn.net/a67474506/article/details/40428709
activiti入门3排他网关,并行网管,包含网关,事件网关(转)的更多相关文章
- activiti入门3排他网关,并行网管,包括网关,事件网关
网关用来控制流程的流向 网关能够消费也能够生成token. 网关显示成菱形图形,内部有有一个小图标. 图标表示网关的类型. 基本分支 首先 利用 流程变量 写个带有分支的一个基本流程 流程图: wa ...
- 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 美空网未登录图片爬取
美空网未登录图片----简介 上一篇写的时间有点长了,接下来继续把美空网的爬虫写完,这套教程中编写的爬虫在实际的工作中可能并不能给你增加多少有价值的技术点,因为它只是一套入门的教程,老鸟你自动绕过就可 ...
随机推荐
- virtualbox 虚拟3台虚拟机搭建hadoop集群
用了这么久的hadoop,只会使用streaming接口跑任务,各种调优还不熟练,自定义inputformat , outputformat, partitioner 还不会写,于是干脆从头开始,自己 ...
- android 38 Abdroid客户端和服务端交互
服务端: package com.sxt.day05; import java.io.IOException; import java.util.ArrayList; import javax.ser ...
- linux下的僵尸进程处理SIGCHLD信号
什么是僵尸进程? 首先内核会释放终止进程(调用了exit系统调用)所使用的所有存储区,关闭所有打开的文件等,但内核为每一个终止子进程保存了一定量的信息.这些信息至少包括进程ID,进程的终止状态,以及该 ...
- tcmalloc资料
1. 确定dylib在max os是可以成功的. http://lists.apple.com/archives/perfoptimization-dev/2008/Dec/msg00002.html ...
- phpstorm 快捷方式 (备用)
常用快捷键 设置快捷键:File -> Settings -> IDE Settings -> Keymap -> 选择“eclipse” -> 然后“Copy”一份 ...
- java_Collection 类集
大体概念
- Couchbase用的端口
文档首页: http://www.couchbase.com/documentation http://docs.couchbase.com/couchbase-manual-2.2/#prepara ...
- 关于 Repository和UnitOfWork 模式的关系
本以为,关于这方面的理解,园子中的文章已经很多的了,再多做文章真的就“多做文章了”,但是最近发现,还是有必要的,首先,每个人对于同一事物的理解方式和出发点都是不同的,所以思考的方式得到结果也是不同的. ...
- linux常用命令之ln
ln是linux中又一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同不的链接,这个命令最常用的参数是-s,具体用法是:ln –s 源文件 目标文件. 当我们需要在不同的目录,用到相同的 ...
- javascript基础学习(一)
javascript输出: javascript通过不同的方式来显示数据: (1)windows.alert()弹出警告框: (2)document.write()将方法写入HTML文档中: (3)i ...