上一篇博客我们讲到了排他网管,这篇博文简单介绍一下他的兄弟,并行网关.
并行网关描述
网关也可以表示流程中的并行情况。最简单的并行网关是 并行网关 ,它允许将流程 分 成多条分支,也可以把多条分支 汇 聚 到一起。
并行网关图形
并行网关显示成一个普通网关(菱形)内部是一个“加号”图标, 表示“与(AND)”语义。
流程图
图一 并行网关网购流程图
在这里,我们模拟网上购物流程,四个用户任务,分别是付款、发货、收款、收货,其中付款和收货的办理人是买家,发货和收款的办理人是卖家。
部署和启动流程
-
- @Test
- public void deployementAndStartProcess(){
- InputStream inputStreamBpmn = this.getClass().getResourceAsStream("parallelGateWay.bpmn");
- InputStream inputStreampng = this.getClass().getResourceAsStream("parallelGateWay.png");
-
- Deployment deployment = processEngine.getRepositoryService()
- .createDeployment()
- .addInputStream("parallelGateWay.bpmn", inputStreamBpmn)
- .addInputStream("parallelGateWay.png", inputStreampng)
- .name("并行网关演示")
- .deploy();
- System.out.println("部署ID:"+deployment.getId());
-
- ProcessInstance pi = processEngine.getRuntimeService()
- .startProcessInstanceByKey("parallelGateWay");
- System.out.println("流程实例ID:"+pi.getId());
- System.out.println("流程定义的ID:"+pi.getProcessDefinitionId());
- }
对应数据库表:
1.表act_ru_execution 正在执行的执行对象表
我们可以看到,部署和启动流程后,在act_ru_execution表中对应三条记录,1个流程实例(执行流程实例的ID:2605它的执行对象ID和流程实例的ID都是2605),2个执行对象(执行对象的ID分别为:2608和2609)。
2.act_ru_task表 流程实例的历史记录表
在act_ru_task表中,有两条正在执行的任务,分别是付款和发货。
当四个任务都完成了我们可以观察
查询当前任务
-
- @Test
- public void findPersonalTaskList(){
-
- String assignee = "买家";
- List<Task> list = processEngine.getTaskService()
- .createTaskQuery()
- .taskAssignee(assignee)
- .list();
- if(list!=null && list.size()>0){
- for(Task task:list){
- System.out.println("任务ID:"+task.getId());
- System.out.println("任务的办理人:"+task.getAssignee());
- System.out.println("任务名称:"+task.getName());
- System.out.println("任务的创建时间:"+task.getCreateTime());
- System.out.println("流程实例ID:"+task.getProcessInstanceId());
- System.out.println("#######################################");
- }
- }
- }
我们通过设置的办理人的名字,买家和商家,可以查询到他们对应的当前任务的信息:
1.买家
2.商家
完成任务
-
- @Test
- public void completeTask(){
-
- String taskId = "2611";
- processEngine.getTaskService()
- .complete(taskId);
- System.out.println("完成任务:"+taskId);
- }
执行结果如下:
1.完成【付款】任务,第一个流程实例自动流转到下个任务:收款
2.完成【发货】任务,第二个流程实例自动流转到下一个任务:收货
当我们完成了四个任务之后,再去观察表act_hi_actinst(所有活动节点的历史表(包括任务和不是任务的活动节点))可以发现历史活动表中会产生九条数据记录,而不是八条,因为当收货执行完会在历史活动表中产生两条活动记录(收货和parallelgateway),当执行完收款也会在历史活动表中产生两条活动记录(收款和parallelgateway),所以这个流程结束后总共包括九个活动分别为:开始、parallelgateway(分支网关)、付款、发货、收货、parallelgateway(聚合网关)、收款、parallelgateway(聚合网关)、结束。
总结:
(1)一个流程中流程实例只有1个,执行对象有多个;
(2)并行网关的功能是基于进入和外出的顺序流的:
分支(fork):并行后的所有外出顺序流,为每个顺序流都创建一个并发分支。
汇聚(join):所有到达并行网关,在此等待的进入分支,直到所有进入顺序流的分支都到达以后,流程就会通
过汇聚网关。
注意:如果同一个并行网关有多个进入和多个外出顺序流, 它就同时具有 分支和汇聚功能 。 这时,网关会先汇聚所有进入的顺序流,然后再切分成多个并行分支。
(3)并行网关的进入和外出都是用相同的节点标识
(4)并行网关不会解析条件,即使顺序流中定义了条件,也会被忽略,所以不用在连线上添加流程变量判断流程流向。