网关用来控制流程的流向 网关可以消费也可以生成token。 网关显示成菱形图形,内部有有一个小图标。 图标表示网关的类型。 基本分支首先 利用 流程变量 写个带有分支的一个基本流程 流程图:
部署流程文件: ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); public void deployFlow(){ RepositoryService repositoryService = processEngine.getRepositoryService(); InputStream in = this.getClass().getResourceAsStream('/MyProcess11.zip'); ZipInputStream zipInputStream = new ZipInputStream(in); Deployment dm = repositoryService.createDeployment() .addZipInputStream(zipInputStream) System.out.println('id:'+dm.getId()+',name:'+dm.getName());
启动流程 并 设置请假天数为 3天的 流程变量 提交 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(); Task task = taskService.createTaskQuery() .processInstanceId(pi.getProcessInstanceId()) System.out.println('taskID:'+task.getId()+',name:'+task.getName()); Map<String, Object> paramMap = new HashMap<String, Object>(); taskService.complete(task.getId(), paramMap); task = taskService.createTaskQuery() .processInstanceId(pi.getProcessInstanceId()) System.out.println('taskID:'+task.getId()+',name:'+task.getName()); System.out.println('任务执行完毕');
最后的运行结果:id:1501,流程实例ID:1501,流程定义ID:leave:2:1404
我们可以再数据库中查看:
我们再部署一个 流程文件 , 并且在提交 任务的时候 设置流程变量 请假天数为 10天
最后的运行结果 id:1701,流程实例ID:1701,流程定义ID:leave:3:1604
现在 流程就到了另外 一条线
年纪主任审批通过: 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(); public void deployFlow2(){ RepositoryService repositoryService = processEngine.getRepositoryService(); InputStream in = this.getClass().getResourceAsStream('/exclusiveGateway.zip'); ZipInputStream zipInputStream = new ZipInputStream(in); Deployment dm = repositoryService.createDeployment() .addZipInputStream(zipInputStream) System.out.println('id:'+dm.getId()+',name:'+dm.getName());
启动流程, 并提交 设置 请假天数 为 10天 结果id:2001,流程实例ID:2001,流程定义ID:exclusiveGateWay:1:1904
再 重新部署一个流程文件 然后启动 提交 设置请假天数为 30天 执行结果 id:2201,name:学生请假
id:2301,流程实例ID:2301,流程定义ID:exclusiveGateWay:2:2204
最后在 部署一遍, 这次设置请假天数为 3天 结果id:2501,name:学生请假
id:2601,流程实例ID:2601,流程定义ID:exclusiveGateWay:3:2504
这里 流程走到了 当初 默认的设置 班主任审批
当我们设置了 默认 的 配置 ,即使没有 设置表达式 流程 条件都 不满足的时候 都会执行默认的
并行网关 并行网关描述网关也可以表示流程中的并行情况。最简单的并行网关是 并行网关,它允许将流程 分成多条分支,也可以把多条分支 汇聚到一起。 of execution. 并行网关的功能是基于进入和外出的顺序流的: 注意,如果同一个并行网关有多个进入和多个外出顺序流, 它就同时具有分支和汇聚功能。 这时,网关会先汇聚所有进入的顺序流,然后再切分成多个并行分支。 与其他网关的主要区别是,并行网关不会解析条件。 即使顺序流中定义了条件,也会被忽略。 并行网关图形并行网关显示成一个普通网关(菱形)内部是一个“加号”图标, 表示“与(AND)”语义。 首先 画一个简单的并行流程
注意 并行 网关 要有2个 一个是用于 分支 一个用于 聚合 部署启动
public void deployFlow3() { RepositoryService repositoryService = processEngine 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:2901,流程实例ID:2901,流程定义ID:parallel:1:2804 此时流程进入 启动项目环节 通过流程实例ID 查看当前流程 进度 public void startProcessAndComp3() { TaskService taskService = processEngine.getTaskService(); Task task = taskService.createTaskQuery().processInstanceId('2901').singleResult(); System.out.println('taskID:' + task.getId() + ',name:' System.out.println('任务执行完毕'); task = taskService.createTaskQuery().processInstanceId('2901').singleResult(); System.out.println('taskID:' + task.getId() + ',name:' + task.getName()); taskService.complete(task.getId());
提交任务后,流程进入并行环节,同时执行 功能模块1 和 功能模块2 这是我们可以看到 流程实例ID 和 执行对象ID 已经是不同了
这个是 act_ru_execution 表的数据
我们先 提交一个 功能模块1的任务 在看 任务表 act_ru_task 此时 任务表 只有 功能模块2
我们在看 act_ru_execution 这个表 依旧是3条数据 功能模块1 的执行流程 被阻塞在 并行网关这里 没有进入 测试发布这个 环节
在提交功能模块2 任务 查看 这 2个表
流程 已经 进入 下一个环节 提交最后一个人 整个流程结束, 我们在查看 历史活动表 act_hi_actinst
整个流程 分成了 2 块
包含网关 包含网关描述包含网关可以看做是排他网关和并行网关的结合体。 和排他网关一样,你可以在外出顺序流上定义条件,包含网关会解析它们。 但是主要的区别是包含网关可以选择多于一条顺序流,这和并行网关一样。 包含网关的功能是基于进入和外出顺序流的: 注意,如果同一个包含节点拥有多个进入和外出顺序流, 它就会同时含有分支和汇聚功能。 这时,网关会先汇聚所有拥有流程token的进入顺序流, 再根据条件判断结果为true的外出顺序流,为它们生成多条并行分支。 包含网关图形并行网关显示为一个普通网关(菱形),内部包含一个圆圈图标。
当 main config 中的 表达式 条件返回的结果为真时 执行 并行网关 结果为假时 执行 排他任务 具体的 流程 这里就不介绍了 事件网关 事件网关描述基于事件网关允许根据事件判断流向。网关的每个外出顺序流都要连接到一个中间捕获事件。 当流程到达一个基于事件网关,网关会进入等待状态:会暂停执行。 与此同时,会为每个外出顺序流创建相对的事件订阅。 注意基于事件网关的外出顺序流和普通顺序流不同。这些顺序流不会真的'执行'。 相反,它们让流程引擎去决定执行到基于事件网关的流程需要订阅哪些事件。 要考虑以下条件: 事件网关图形事件网关和其他BPMN网关一样显示成一个菱形, 内部包含指定图标。
这里 事件 太多了 就 先到这里 0.0
|