ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
![](https://img.kancloud.cn/ae/3c/ae3c16005e6612fb273abd0be9095751_1225x174.png) 并行网关允许将流程分成多条分支,也可以把多条分支汇聚到一起,并行网关的功能是基于进入和外出顺序流的。 <br/> `fork分支`:并行后的所有外出顺序流,为每个顺序流都创建一个并发分支。 `join汇聚`: 所有到达并行网关,在此等待的进入分支, 直到所有进入顺序流的分支都到达以后, 流程就会通过汇聚网关。 <br/> 注意,如果同一个并行网关有多个进入和多个外出顺序流, 它就同时具有分支和汇聚功能。 这时,网关会先汇聚所有进入的顺序流,然后再切分成多个并行分支。 <br/> <mark>与其他网关的主要区别是,并行网关不会解析条件。即使顺序流中定义了条件,也会被忽略。</mark> <br/> 演示,步骤如下: **1. 流程定义** ![](https://img.kancloud.cn/73/06/73067a9163da31cc8fda2db7357afca7_666x549.png) 技术经理和项目经理是两个execution分支,在act_ru_execution表有两条记录分别是技术经理和项目经理,act_ru_execution还有一条记录表示该流程实例。 待技术经理和项目经理任务全部完成,在汇聚点汇聚,通过parallelGateway并行网关。 并行网关在业务应用中常用于会签任务,会签任务即多个参与者共同办理的任务。 **2. java程序** ```java public class ActivitiGatewayParallel { /** * 部署流程定义 */ @Test public void testDeployment() { //1、创建ProcessEngine ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2、得到RepositoryService实例 RepositoryService repositoryService = processEngine.getRepositoryService(); //3、使用RepositoryService进行部署 Deployment deployment = repositoryService.createDeployment() .addClasspathResource("bpmn/evection-parallel.bpmn") .addClasspathResource("bpmn/evection.png") .name("出差申请流程-并行网关") .deploy(); //4、输出部署信息 System.out.println("流程部署id:" + deployment.getId()); System.out.println("流程部署名称:" + deployment.getName()); } /** * 启动流程实例,设置流程变量的值 */ @Test public void startProcess() { //获取流程引擎 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //获取RunTimeService RuntimeService runtimeService = processEngine.getRuntimeService(); //流程定义key String key = "parallel"; //创建变量集合 Map<String, Object> map = new HashMap<String, Object>(); //创建出差pojo对象 Evection evection = new Evection(); //设置出差天数 evection.setNum(4d); //定义流程变量,把出差pojo对象放入map map.put("evection", evection); //启动流程实例,并设置流程变量的值(把map传入) ProcessInstance processInstance = runtimeService .startProcessInstanceByKey(key, map); //输出 System.out.println("流程实例名称=" + processInstance.getName()); System.out.println("流程定义id==" + processInstance.getProcessDefinitionId()); } /** * 启动流程实例 */ @Test public void testStartProcess() { //1、创建ProcessEngine ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2、获取RunTimeService RuntimeService runtimeService = processEngine.getRuntimeService(); //3、根据流程定义Id启动流程 ProcessInstance processInstance = runtimeService .startProcessInstanceByKey("parallel"); //输出内容 System.out.println("流程定义id:" + processInstance.getProcessDefinitionId()); System.out.println("流程实例id:" + processInstance.getId()); System.out.println("当前活动Id:" + processInstance.getActivityId()); } @Test public void completTask() { //流程定义的Key String key = "parallel"; //任务负责人 String assingee = "jack"; //获取流程引擎 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //获取taskservice TaskService taskService = processEngine.getTaskService(); //查询任务 Task task = taskService.createTaskQuery() .processDefinitionKey(key) .taskAssignee(assingee) .singleResult(); if (task != null) { //根据任务id来完成任务 taskService.complete(task.getId()); } } } ``` **3. 测试结果** 当执行到并行网关数据库跟踪如下: (1)有两个任务当前执行。 ```sql select * from act_ru_task; ``` ![](https://img.kancloud.cn/63/60/6360d82f21d6adb519999f1eb48c944a_946x54.png) (2)当前流程实例有多个分支(两个)在运行。 ```sql select * from act_ru_execution ; ``` ![](https://img.kancloud.cn/b0/a0/b0a0b053a2310b0f3a6e966557b0f112_912x72.png) (3)执行技术经理任务后,查询当前任务表,已完成的技术经理任务在当前任务表act_ru_task_已被删除。 ```sql select * from act_ru_task; ``` ![](https://img.kancloud.cn/18/15/18157cd87ac619e8d9af78275d432b01_606x41.png) (4)在流程实例执行表中多个分支存在且有并行网关的汇聚结点。 ```sql select * from act_ru_execution ; ``` ![](https://img.kancloud.cn/98/b5/98b50a9d9f75efc6b9d3f4eb20ac94aa_917x76.png) (5)当所有分支任务都完成,都到达汇聚结点后,执行流程实例已经变为总经理审批,说明流程执行已经通过并行网关。 ```sql select * from act_ru_execution ; ``` ![](https://img.kancloud.cn/77/6d/776d00c7f6770c39185187d1de2dd1bd_917x61.png)