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 美空网未登录图片爬取
美空网未登录图片----简介 上一篇写的时间有点长了,接下来继续把美空网的爬虫写完,这套教程中编写的爬虫在实际的工作中可能并不能给你增加多少有价值的技术点,因为它只是一套入门的教程,老鸟你自动绕过就可 ...
随机推荐
- python-函数(命名空间、作用域、闭包)
一.命名空间 全局命名空间 局部命名空间 内置命名空间 *内置命名空间中存放了python解释器为我们提供的名字:input,print,str,list,tuple...它们都是我们熟悉的,拿过来就 ...
- 安装配置Elasticserch的方法
1.安装java环境 先查看环境是否安装 yum list installed |grep java 如果存在自带的环境则卸载 yum -y remove java--openjdk* 查看安装包 y ...
- yii2中判断数据表是否存在数据库中(原创)
分为两步: 第一步,找出数据库中所有表名,表名得到的是二维数组. 第二步,判断表名是否存在二维数组中 下面就贴我的代码咯. $table_name =‘table’; $juge = $handle- ...
- django CXRF介绍
CSRF(Cross-site request forgery)跨站请求伪造,是攻击者利用用户的身份操作用户帐户的一种攻击方式.和XSS攻击一样,存在巨大的危害性. 一.攻击方法 1.低级的CXRF攻 ...
- HDU 1061.Rightmost Digit-规律题 or 快速幂取模
Rightmost Digit Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- python 2 控制台传参,解包,编码问题初探
python 2 控制台传参,需要从sys模块中导入argv,argv返回的第一个参数当前脚本(script)的文件名,后面是参数,参数个数必须和解包(unpack)时使用的参数个数一致 1.本例子演 ...
- 二分+Kruskal【p2798】爆弹虐场
Description 某年某月某日,Kiana 结识了一名爆弹虐场的少年. Kiana 仗着自己多学了几年OI,所以还可以勉勉强强给这位少年 讲一些自己擅长的题.具体来说,Kiana 先给这位少年灌 ...
- Linux命令之ps
ps [选项] 报告当前进程状态.ps显示有关选择的活动进程的信息.如果要重复更新选择和显示的信息,请使用top.ps命令可以搭配kill随时中断.删除不必要的程序.ps命令是最基本同时也是非常强大的 ...
- Linux命令之file
file [选项] [文件名] 确认文件类型 (1).常用选项 magic file指的是哪些具有特殊文件格式的文件 -b,--brief 不列出文件名称 -c,--checking-printout ...
- 数字 function
SELECT TRUNC(15.79), TRUNC(), ROUND(15.79), ), ), FLOOR(26.983), CEIL(26.123), ), ), ), MOD(,) FROM ...