1排他网关

1.1 什么是排他网关

排他网关(也叫异或(XOR)网关,或叫基于数据的排他网关),用来在流程中实现决策。 当流程
执行到这个网关,所有分支都会判断条件是否为 true,如果为 true 则执行该分支,
注意,排他网关只会选择一个为 true 的分支执行。 (即使有两个分支条件都为 true, 排他网关也会只
选择一条分支去执行)
为什么要用排他网关?
不用排他网关也可以实现分支,如下图:

上图中,在连线的 condition 条件上设置分支条件。
缺点:
如果条件都不满足,不使用排他网关,流程就结束了(是异常结束)。
如果 使用排他网关决定分支的走向,如下:

如果从网关出去的线所有条件都不满足则系统抛出异常。

说明 :经过排他网关必须要有一条且只有一条分支走

测试没有排他网关的

//1.部署流程定义
public static void main(String[] args) {
//1.创建ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2.得到RepositoryService实例
RepositoryService repositoryService = processEngine.getRepositoryService(); //3.进行部署
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("diagram/day05/holiday4.bpmn") //添加bpmn资源
//.addClasspathResource("diagram/day05/holiday4.png")
.name("请假申请单流程")
.deploy(); //4.输出部署的一些信息
System.out.println(deployment.getName());
System.out.println(deployment.getId());
}
  //2.启动流程实例
public static void main(String[] args) {
//1.得到ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2.得到RunService对象
RuntimeService runtimeService = processEngine.getRuntimeService(); Holiday holiday = new Holiday();
holiday.setNum(5F);
Map<String,Object> map = new HashMap<>();
map.put("holiday",holiday);//流程变量赋值 //3.创建流程实例 流程定义的key需要知道 holiday
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess_1",map); //4.输出实例的相关信息
System.out.println("流程定义ID"+processInstance.getProcessDefinitionId());//holiday:1:4
System.out.println("流程实例ID"+processInstance.getId());//
}
  //3.填写请假单的任务要执行完成
public static void main(String[] args) {
//1.得到ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2.得到TaskService对象
TaskService taskService = processEngine.getTaskService(); //3.查询当前用户的任务
Task task = taskService.createTaskQuery()
.processDefinitionKey("myProcess_1")
.taskAssignee("lishi")
.singleResult(); //4.处理任务,结合当前用户任务列表的查询操作的话,任务ID:task.getId()
if(task!=null){
taskService.complete(task.getId());
System.out.println("用户任务执行完毕...");
} //5.输出任务的id
System.out.println(task.getId());
}

没有排他,任务会分配到2个人

测试排他网关

    //1.部署流程定义
public static void main(String[] args) {
//1.创建ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2.得到RepositoryService实例
RepositoryService repositoryService = processEngine.getRepositoryService(); //3.进行部署
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("diagram/day05/holiday5.bpmn") //添加bpmn资源
//.addClasspathResource("diagram/day05/holiday5.png")
.name("请假申请单流程")
.deploy(); //4.输出部署的一些信息
System.out.println(deployment.getName());
System.out.println(deployment.getId());
}
  //2.启动流程实例
public static void main(String[] args) {
//1.得到ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2.得到RunService对象
RuntimeService runtimeService = processEngine.getRuntimeService(); Holiday holiday = new Holiday();
holiday.setNum(5F);
Map<String,Object> map = new HashMap<>();
map.put("holiday",holiday);//流程变量赋值 //3.创建流程实例 流程定义的key需要知道 holiday
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("holidayExclusive",map); //4.输出实例的相关信息
System.out.println("流程定义ID"+processInstance.getProcessDefinitionId());//holiday:1:4
System.out.println("流程实例ID"+processInstance.getId());//
}
 //3.填写请假单的任务要执行完成
public static void main(String[] args) {
//1.得到ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2.得到TaskService对象
TaskService taskService = processEngine.getTaskService(); //3.查询当前用户的任务
Task task = taskService.createTaskQuery()
.processDefinitionKey("holidayExclusive")
.taskAssignee("lisi")
.singleResult(); //4.处理任务,结合当前用户任务列表的查询操作的话,任务ID:task.getId()
if(task!=null){
taskService.complete(task.getId());
System.out.println("用户任务执行完毕...");
} //5.输出任务的id
System.out.println(task.getId());
}

会发现假如排他网关以后,只会产生一个作业,且他的开始时间就是网关的结束时间

2并行网关

2.1什么是并行网关

并行网关允许将流程分成多条分支,也可以把多条分支汇聚到一起,并行网关的功能是基于进
入和外出顺序流的:
 fork 分支:
并行后的所有外出顺序流,为每个顺序流都创建一个并发分支。
 join 汇聚:
所有到达并行网关,在此等待的进入分支, 直到所有进入顺序流的分支都到达以后, 流程就会通
过汇聚网关。
注意,如果同一个并行网关有多个进入和多个外出顺序流, 它就同时具有分支和汇聚功能。 这时,
网关会先汇聚所有进入的顺序流,然后再切分成多个并行分支。
与其他网关的主要区别是,并行网关不会解析条件。 即使顺序流中定义了条件,也会被忽略。

    //1.部署流程定义  带排他网关,同时还带并行网关
public static void main(String[] args) {
//1.创建ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2.得到RepositoryService实例
RepositoryService repositoryService = processEngine.getRepositoryService(); //3.进行部署
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("diagram/day05/holiday6.bpmn") //添加bpmn资源
//.addClasspathResource("diagram/day05/holiday5.png")
.name("请假申请单流程")
.deploy(); //4.输出部署的一些信息
System.out.println(deployment.getName());
System.out.println(deployment.getId());
}
  //2.启动流程实例
public static void main(String[] args) {
//1.得到ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2.得到RunService对象
RuntimeService runtimeService = processEngine.getRuntimeService(); Holiday holiday = new Holiday();
holiday.setNum(5F);
Map<String,Object> map = new HashMap<>();
map.put("holiday",holiday);//流程变量赋值 //3.创建流程实例 流程定义的key需要知道 holiday
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("holidayParallel",map); //4.输出实例的相关信息
System.out.println("流程定义ID"+processInstance.getProcessDefinitionId());//holiday:1:4
System.out.println("流程实例ID"+processInstance.getId());//
}

开始完成任务,一直流转到并行网关

 //3.填写请假单的任务要执行完成
public static void main(String[] args) {
//1.得到ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2.得到TaskService对象
TaskService taskService = processEngine.getTaskService(); //3.查询当前用户的任务
Task task = taskService.createTaskQuery()
.processDefinitionKey("holidayParallel")
.taskAssignee("zhaoliu")
.singleResult(); //4.处理任务,结合当前用户任务列表的查询操作的话,任务ID:task.getId()
if(task!=null){
taskService.complete(task.getId());
System.out.println("用户任务执行完毕...");
} //5.输出任务的id
System.out.println(task.getId());
}

有并行网关的汇聚结点:说明有一个分支已经到汇聚,等待其它的分支到达。
当所有分支任务都完成,都到达汇聚结点后:
流程实例执行表: SELECT * FROM act_ru_execution,执行流程实例不存在,说明流程执行结束。
总结:所有分支到达汇聚结点,并行网关执行完成。

3 包含网关

3.1什么是包含网关

包含网关可以看做是排他网关和并行网关的结合体。 和排他网关一样,你可以在外出顺序流上
定义条件,包含网关会解析它们。 但是主要的区别是包含网关可以选择多于一条顺序流,这和并行
网关一样。
包含网关的功能是基于进入和外出顺序流的:
 分支:
所有外出顺序流的条件都会被解析,结果为 true 的顺序流会以并行方式继续执行, 会为每个顺序流
传智播客——专注于 Java、 .Net 和 Php、网页平面设计工程师的培训
北京市昌平区建材城西路金燕龙办公楼一层 电话: 400-618-9090
创建一个分支。
 汇聚:
所有并行分支到达包含网关,会进入等待状态, 直到每个包含流程 token 的进入顺序流的分支都
到达。 这是与并行网关的最大不同。换句话说,包含网关只会等待被选中执行了的进入顺序流。 在
汇聚之后,流程会穿过包含网关继续执行。
3.2流程定义:
企业体检流程,公司全体员工进行常规项检查、抽血化验,公司管理层除常规检查和抽血化验还要
进行增加项检查。
图标

员工类型:
通过流程变量 userType 来表示,如果等于 1 表示普通员工,如果等于 2 表示领导

 //1.部署流程定义
public static void main(String[] args) {
//1.创建ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2.得到RepositoryService实例
RepositoryService repositoryService = processEngine.getRepositoryService(); //3.进行部署
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("diagram/day05/examine.bpmn") //添加bpmn资源
//.addClasspathResource("diagram/day05/examine.png")
.name("体检流程")
.deploy(); //4.输出部署的一些信息
System.out.println(deployment.getName());
System.out.println(deployment.getId());
}
  //2.启动流程实例
public static void main(String[] args) {
//1.得到ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2.得到RunService对象
RuntimeService runtimeService = processEngine.getRuntimeService(); Integer userType = 2;//代表管理者
Map<String,Object> map = new HashMap<>();
map.put("userType",userType);//流程变量赋值 //3.创建流程实例 流程定义的key需要知道 holiday
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("examine",map); //4.输出实例的相关信息
System.out.println("流程定义ID"+processInstance.getProcessDefinitionId());//holiday:1:4
System.out.println("流程实例ID"+processInstance.getId());//
}

先走到汇聚结点的分支,要等待其它分支走到汇聚。
等所有分支走到汇聚,包含网关就执行完成。
包含网关执行完成,分支和汇聚就从 act_ru_execution 删除。
小结:在分支时,需要判断条件, 符合条件的分支,将会执行,符合条件的分支最终才进行汇聚。

总结

如何使用 activiti 开发?
 第一步:部署 activiti 的环境。
环境包括: jar 包和数据库(25 张表)
业务系统通过 spring 和 activiti 整合进行开发。
 第二步:使用 activiti 提供流程设计器(和 idea 或 eclipse 集成的 designer)工具进行流程定义
流程定义生成两个文件: .bpmn 和.png(不是必须的)。
 第三步;将流程定义文件部署到 activiti 的数据库
SELECT * FROM act_re_deployment #流程定义部署表
一次部署插入一条记录,记录流程定义的部署信息
SELECT * FROM act_re_procdef #流程定义表
一次部署流程定义信息,如果一次部署两个流程定义,插入两条记录
建议:一次部署只部署一个流程定义,这样 act_re_deployment 和 act_re_procdef 一对一关系
常用两个方法:单个文件部署和 zip 文件部署。
建议单个文件部署。
 第四步: 启动一个流程实例
业务系统就可以按照流程定义去执行业务流程,执行前需要启动一个流程实例
根据流程定义来启动一个流程实例。
指定一个流程定义的 key 启动一个流程实例, activiti 根据 key 找最新版本的流程定义。
指定一个流程定义的 id 启动一个流程实例。
启动一个实例需要指定 businesskey(业务标识), businessKey 是 activiti 和业务系统整合时桥梁。
比如: 请假流程, businessKey 就是请假单 id。
启动一个实例还可以指定流程变量,流程变量是全局变量(生命期是整个流程实例,流程实例结束,
变量就消失)
 第五步:查询待办任务

查询个人任务:使用 taskService,根据 assignee 查询该用户当前的待办任务。
查询组任务:使用 taskService,根据 candidateuser 查询候选用户当前的待办组任务。
 第六步:办理任务
办理个人任务:调用 taskService 的 complete 方法完成任务。
如果是组任务,需要先拾取任务,调用 taskService 的 claim 方法拾取任务,拾取任务之后组任务就
变成了个人任务(该任务就有负责人)。
网关:
排他网关:任务执行之后的分支,经过排他网关分支只有一条有效。
并行网关:任务执行后,可以多条分支,多条分支总会汇聚,汇聚完成,并行网关结束。
包含网关:是排他网关和并行网关结合体。

Acvitivi网关(十一)的更多相关文章

  1. IdentityServer4-主题

    一.Startup 二.定义Resources 三.定义Clients 四.登录 五.使用外部身份提供商登录 六.Windows身份验证 七.登出 八.注销外部身份提供商 九.联合注销 十.联合网关 ...

  2. Spring Cloud(十一):服务网关 Zuul(过滤器)【Finchley 版】

    Spring Cloud(十一):服务网关 Zuul(过滤器)[Finchley 版]  发表于 2018-04-23 |  更新于 2018-05-07 |  在上篇文章中我们了解了 Spring ...

  3. 二十一、springcloud(七)服务网关zuul

    1.简介 Eureka用于服务的注册于发现,Feign支持服务的调用以及均衡负载,Hystrix处理服务的熔断防止故障扩散,Spring Cloud Config服务集群配置中心,在微服务架构中,后端 ...

  4. Spring Boot + Spring Cloud 实现权限管理系统 后端篇(二十一):服务网关(Zuul)

    在线演示 演示地址:http://139.196.87.48:9002/kitty 用户名:admin 密码:admin 技术背景 前面我们通过Ribbon或Feign实现了微服务之间的调用和负载均衡 ...

  5. 白话SpringCloud | 第十一章:路由网关(Zuul):利用swagger2聚合API文档

    前言 通过之前的两篇文章,可以简单的搭建一个路由网关了.而我们知道,现在都奉行前后端分离开发,前后端开发的沟通成本就增加了,所以一般上我们都是通过swagger进行api文档生成的.现在由于使用了统一 ...

  6. Spring Cloud(十一):Spring Cloud Zuul网关 Filter、熔断、重试、高可用的使用方式

    上篇文章主要介绍了Zuul网关使用模式,以及自动转发机制,但其实Zuul还有更多的应用场景,比如:鉴权.流量转发.请求统计等等,这些功能都可以使用Zuul来实现. Zuul的核心 Filter是Zuu ...

  7. springcloud(十一):服务网关Zuul高级篇

    时间过的很快,写springcloud(十):服务网关zuul初级篇还在半年前,现在已经是2018年了,我们继续探讨Zuul更高级的使用方式. 上篇文章主要介绍了Zuul网关使用模式,以及自动转发机制 ...

  8. spring cloud深入学习(十一)-----服务网关zuul

    前面的文章我们介绍了,Eureka用于服务的注册于发现,Feign支持服务的调用以及均衡负载,Hystrix处理服务的熔断防止故障扩散,Spring Cloud Config服务集群配置中心,似乎一个 ...

  9. Spring Cloud实战 | 第十一篇:Spring Cloud Gateway 网关实现对RESTful接口权限控制和按钮权限控制

    一. 前言 hi,大家好,这应该是农历年前的关于开源项目 的最后一篇文章了. 有来商城 是基于 Spring Cloud OAuth2 + Spring Cloud Gateway + JWT实现的统 ...

随机推荐

  1. 测试需要了解的技术之基础篇四__UI自动化测试体系

    UI自动化测试体系 1.Andriod 自动化测试:Appium 环境安装与架构介绍.Appium Desktop用例录制.Appium测试用例流程.元素定位方法 IA/AID/XPATH/UISel ...

  2. finereport点击图表钻取到明细表包括参数传递

    1.  点击编辑图表 2.  参数传递 3.  选择分类名称 4.  钻取明细表获取 inputs 值得方法 使用公司 $inputs   获取钻取传来的值

  3. [Jupyter Notebook] 01 这么多快捷键,我可顶不住!先记个八成吧

    0. 一些说明 为了入门 Python3 安装了 Anaconda,它集成了 Jupyter Notebook 1. 调出快捷键表 打开 Jupyter Notebook,新建一个 Python3(我 ...

  4. SpringBoot自定义Starter实现

    自定义Starter: Starter会把所有用到的依赖都给包含进来,避免了开发者自己去引入依赖所带来的麻烦.Starter 提供了一种开箱即用的理念,其中核心就是springboot的自动配置原理相 ...

  5. CentOS8 下 Redis5.0.7 哨兵Sentinel 模式配置指南

    下载Redis Redis下载链接 解压缩 tar -xzvf redis-5.0.7.tar.gz 编译安装 make和gcc依赖 可通过yum -y install gcc automake au ...

  6. C语言黑与白问题

    问题描述: 有A.B.C.D.E这5个人,每个人额头上都帖了一张黑或白的纸.5人对坐,每 个人都可以看到其他人额头上纸的颜色.5人相互观察后: A说:“我看见有3人额头上贴的是白纸,1人额头上贴的是黑 ...

  7. yaf框架安装

    第一步:明白yaf框架是以扩展的形式要先配置到php里面,对于windows系统的使用者,首先要去官网:http://code.google.com/p/yafphp/downloads/list如果 ...

  8. 搜索专题: HDU1258Sum It Up

    Sum It Up Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total ...

  9. 该项目不知道如何运行配置文件 IIS Express。The project doesn’t know how to run the profile IIS Express

    原文:该项目不知道如何运行配置文件 IIS Express. 方案1(推荐). 可能原因是:禁用掉Microsft ASP.NET和Web工具扩展和微软Azure的应用程序服务工具扩展,恢复启用即可. ...

  10. Hangfire

    参考 开源分布式Job系统,调度与业务分离-如何创建一个计划HttpJob任务