网关

suaxi
2024-07-17 / 0 评论 / 103 阅读 / 正在检测是否收录...

1. 排他网关

排他网关(exclusive gateway)用于对流程中的决策建模,当执行到达这个网关时,会按照所有出口顺序流定义的顺序对它们进行计算,选择第一个条件计算为 true 的顺序流(当没有设置条件时,认为当前顺序流为 true)继续流程。

(1)流程图

1.网关-排他网关.png

(2)测试

package com.sw.camundademo;

import org.camunda.bpm.engine.RepositoryService;
import org.camunda.bpm.engine.RuntimeService;
import org.camunda.bpm.engine.TaskService;
import org.camunda.bpm.engine.repository.Deployment;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.HashMap;
import java.util.Map;

/**
 * @Author Suaxi
 * @Date 2024/7/15 21:26
 * @Description
 */
@SpringBootTest
public class ExclusiveGatewayTest {

    @Autowired
    private RepositoryService repositoryService;

    @Autowired
    private RuntimeService runtimeService;

    @Autowired
    private TaskService taskService;

    @Test
    public void deploy() {
        Deployment deploy = repositoryService.createDeployment()
                .name("网关-排他网关")
                .addClasspathResource("flow/10.网关-排他网关.bpmn")
                .deploy();
        System.out.println(deploy.getId());
    }

    @Test
    public void startProcess() {
        String processId = "Process_18phe80:1:5fc9d4f7-42ae-11ef-b9f8-a8a1592cf182";
        runtimeService.startProcessInstanceById(processId);
    }

    @Test
    public void completeTask() {
        String taskId = "ad9c02f2-42ae-11ef-ad23-a8a1592cf182";
        
        Map<String, Object> variables = new HashMap<>();
        variables.put("day", 4);
        
        taskService.complete(taskId, variables);
    }
}

注:当排他网关执行过程中有多个条件都满足时,流程引擎会根据bpmn流程图中顺序流的绘制顺序从前往后(从上到下)的顺序走

2. 并行网关

并行网关(parallel gateway)允许将流程分为多条分支,也可以把多条分支汇聚到一起,并行网关的功能基于进入/外出顺序流:

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

如果一个并行网关既有进入,也有外出顺序六流(即同时具有分支和汇聚的功能),此时网关会先汇聚所有进入的顺序流,然后再切分成多个并行分支

并行网关不会解析条件,即使在顺序流中定义了,也会被忽略

(1)流程图

2.1网关-并行网关.png

(2)测试

package com.sw.camundademo;

import org.camunda.bpm.engine.RepositoryService;
import org.camunda.bpm.engine.RuntimeService;
import org.camunda.bpm.engine.TaskService;
import org.camunda.bpm.engine.repository.Deployment;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

/**
 * @Author Suaxi
 * @Date 2024/7/16 21:58
 * @Description
 */
@SpringBootTest
public class ParallelGatewayTest {

    @Autowired
    private RepositoryService repositoryService;

    @Autowired
    private RuntimeService runtimeService;

    @Autowired
    private TaskService taskService;

    @Test
    public void deploy() {
        Deployment deploy = repositoryService.createDeployment()
                .name("网关-并行网关")
                .addClasspathResource("flow/11.网关-并行网关.bpmn")
                .deploy();
        System.out.println(deploy.getId());
    }

    @Test
    public void startProcess() {
        String processId = "Process_1tykzow:1:93a6df9a-437b-11ef-92d6-a8a1592cf182";
        runtimeService.startProcessInstanceById(processId);
    }

    @Test
    public void completeTask() {
        String taskId = "e5988111-437b-11ef-90a3-a8a1592cf182";
        taskService.complete(taskId);
    }
}


当组长审批完成后,汇聚网关会等待项目经理审批、人事审批分支顺序流完成后才进入到总经理审批节点

2.2网关-并行网关.png


2.3网关-并行网关.png

3. 包含网关

包含网关(inclusive gateway)可以看作是排他网关和并行网关的结合体,和排他网关一样,包含网关可以在外出顺序流上定义条件。

  • 分支:所有外出顺序流的条件都会被解析,结果为 true 的顺序流会以并行方式继续执行,会为每个顺序流创建一个分支
  • 汇聚:所有并行分支到达包含网关,会进入等待状态,直到每个包含流程token的进入顺序流的分支都到达,这是与并行网关最大的不同(即包含网关只会等待被选中执行了的进入顺序流),在汇聚之后,流程继续往后执行

(1)流程图

3.1网关-包容网关.png

(2)测试

package com.sw.camundademo;

import org.camunda.bpm.engine.RepositoryService;
import org.camunda.bpm.engine.RuntimeService;
import org.camunda.bpm.engine.TaskService;
import org.camunda.bpm.engine.repository.Deployment;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.HashMap;
import java.util.Map;

/**
 * @Author Suaxi
 * @Date 2024/7/17 21:32
 * @Description
 */
@SpringBootTest
public class InclusiveGatewayTest {

    @Autowired
    private RepositoryService repositoryService;

    @Autowired
    private RuntimeService runtimeService;

    @Autowired
    private TaskService taskService;

    @Test
    public void deploy() {
        Deployment deploy = repositoryService.createDeployment()
                .name("网关-包容网关")
                .addClasspathResource("flow/12.网关-包容网关.bpmn")
                .deploy();
        System.out.println(deploy.getId());
    }

    @Test
    public void startProcess() {
        String processId = "Process_1j4dy1f:1:ca7ae82d-4441-11ef-8b7e-a8a1592cf182";
        runtimeService.startProcessInstanceById(processId);
    }

    @Test
    public void completeTask() {
        String taskId = "e1ea5b22-4441-11ef-ac89-a8a1592cf182";

        Map<String, Object> variables = new HashMap<>();
        variables.put("day", 4);
        taskService.complete(taskId, variables);
    }
}


当组长审批完成,且传入的变量day为4时,流程走向如下(走了未设置条件和满足条件的两条线):

3.2网关-包容网关.png


3.3网关-包容网关.png

任务表中的数据为:

3.4网关-包容网关.png

0

评论 (0)

取消