ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
![](https://img.kancloud.cn/ae/3c/ae3c16005e6612fb273abd0be9095751_1225x174.png) 并行网关允许将流程分成多条分支,也可以把多条分支汇聚到一起,并行网关的功能是基于进入和外出顺序流的。 <br/> `fork分支`:并行后的所有外出顺序流,为每个顺序流都创建一个并发分支。 `join汇聚`: 所有到达并行网关,在此等待的进入分支, 直到所有进入顺序流的分支都到达以后, 流程就会通过汇聚网关。 <br/> >[warning]注意,如果同一个并行网关有多个进入和多个外出顺序流, 它就同时具有分支和汇聚功能。 这时,网关会先汇聚所有进入的顺序流,然后再切分成多个并行分支。 >[info]与其他网关的主要区别是,并行网关不会解析条件。即使顺序流中定义了条件,也会被忽略。 演示,步骤如下: **1. 流程定义** :-: ![](https://img.kancloud.cn/73/06/73067a9163da31cc8fda2db7357afca7_666x549.png) `evection-parallel.bpmn` 技术经理和项目经理是两个 execution 分支,在 act_ru_execution 表有两条记录分别是技术经理和项目经理,act_ru_execution 还有一条记录表示该流程实例。 <br/> 待技术经理和项目经理任务全部完成,在汇聚点汇聚,通过 ParallelGateway 并行网关。 <br/> 并行网关在业务应用中常用于会签任务,会签任务即多个参与者共同办理的任务。 **2. java程序** ```java public class FlowableGatewayParallel { /** * 1. 部署流程 */ @Test public void testDeployment() { //1、获取ProcessEngine ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2、获取RepositoryService RepositoryService repositoryService = processEngine.getRepositoryService(); //3、部署流程 Deployment deployment = repositoryService.createDeployment() .addClasspathResource("bpmn/evection-parallel.bpmn") .name("出差申请流程") .deploy(); //流程部署id:65001 System.out.println("流程部署id:" + deployment.getId()); //出差申请流程 System.out.println("流程部署名称:" + deployment.getName()); } /** * 2. 启动流程实例, 设置流程变量 */ @Test public void startProcess() { //获取流程引擎 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //获取RunTimeService RuntimeService runtimeService = processEngine.getRuntimeService(); //流程key String key = "evection-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); //流程定义id: evection-parallel:1:65004 System.out.println("流程定义id: " + processInstance.getProcessDefinitionId()); //流程实例id: 67501 System.out.println("流程实例id: " + processInstance.getProcessInstanceId()); //流程版本: 1 System.out.println("流程版本: " + processInstance.getProcessDefinitionVersion()); } /** * 3. 完成个人任务 */ @Test public void completTask() { //流程Key String key = "evection-parallel"; //任务负责人 String assingee = "tom"; //获取流程引擎 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()); //tom完成了任务{id=67508, name=创建出差申请} System.out.println(task.getAssignee() + "完成了任务{id=" + task.getId() + ", name=" + task.getName() + "}"); } } } ``` **3. 测试结果** 当执行到第一个并行网关数据库跟踪如下: ```sql mysql> select * from act_ru_task; +-------+------+---------------+---------------+---------------------------+----...---------+----------------------+---... | ID_ | REV_ | EXECUTION_ID_ | PROC_INST_ID_ | PROC_DEF_ID_ | TASK_...OPE_TYPE_ | SCOPE_DEFINITION_ID... +-------+------+---------------+---------------+---------------------------+----...---------+----------------------+---... | 70004 | 1 | 67505 | 67501 | evection-parallel:1:65004 | NULL | ... | 技术经理审批 | NULL ... | 70008 | 1 | 70002 | 67501 | evection-parallel:1:65004 | NULL | ... | 项目经理审批 | NULL ... +-------+------+---------------+---------------+---------------------------+----...---------+----------------------+---... ``` 上面设置的出差天数为 4 天,却有两个待执行的任务,可见对并行网关设置的条件没用。