Activiti6.0(六)并行网关的使用

目录

一、概述

二、并行网关使用

1、绘制流程图

2、启动流程实例

3、流程流转


一、概述

这也是我们实际场景中用的比较多的网关,并行网关可以表示流程中的并发情况,它允许将流程分成多条分支,也可以将多条分支汇聚到一起,并行网关的功能是基于进入和外出的顺序流:

  • 分支:并行后的所有外出顺序流,为每个顺序流都创建一个并发分支
  • 汇聚:所有到达并行网关在此等待的进入分支,直到所有进入顺序流的分支都到达以后,流程就会通过汇聚网关

这里有几个注意点:

  1. 并行网关不会解析条件,即使顺序流中定义了条件,也会被直接忽略
  2. 在实际使用时,分支与汇聚往往是成对出现的,即有并行开始网关,必定有并行结束网关,否则流程引擎无法判断并行子节点是否都已完成。但是网关是可以不平衡的,即可以有一个并行开始,两个并行结束,同时分支和汇聚的数量也可以不一致

二、并行网关使用

为了使用并行网关,先假设有这么一个场景:某公司需要执行一项财务审批业务,由财务部发起,然后经过所有部门,由各部门分别填写需要审批的金额项,然后先交由各自的部门经理审批,都审批完成后最后交由财务部进行审批。

1、绘制流程图

为了体现注意点2,绘制的流程图网关是不平衡的,如下:

2、启动流程实例

首先启动该流程,代码如下:

@Test
    public void parallelGateway2Test() {
        // 1、发布流程
        Deployment deployment = repositoryService.createDeployment().name("并行网关流程").addClasspathResource("processes/parallelGateway.bpmn20.xml").deploy();

        System.out.println("部署id:" + deployment.getId());

        // 2、启动一个流程实例
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("parallelGateway");
        System.out.println("实例id:" + processInstance.getProcessInstanceId());
        System.out.println("流程定义id:" + processInstance.getProcessDefinitionId());

        // 3、查询所有并行任务
        List<Task> tasks = taskService.createTaskQuery().processInstanceId(processInstance.getProcessInstanceId()).list();

        Assert.assertEquals(3, tasks.size());
        System.out.println("任务数量:" + tasks.size());
    }

启动后我们查看act_ru_execution表,一共生成了四条记录,一条流程实例,三条执行对象,与流程图匹配

查看act_ru_task表,也有三条正在执行的任务记录:

3、流程流转

完成任务代码:

@Test
    public void completeTask() {
        String taskId = "47512";
        taskService.complete(taskId);
    }

首先完成部门1任务,可以看到流程实例自动流转到下一个任务 部门1经理:

然后完成部门2任务,可以看到完成后并不会直接流转到部门2,3经理,因为中间有一个汇聚网关,需要等到所有进入顺序流的分支都到达以后才能流转。

完成部门3任务以后可以看到已自动流转:

由于后面还有一个汇聚网关,也需要部门1经理任务和部门2,3经理任务全部完成后才能出网关,落到财务部。

猜你喜欢

转载自blog.csdn.net/m0_38001814/article/details/104192318