Activities:流程网关管理

网关主要控制 Activiti 流程分支的流向。

排他网关 ExclusiveGateway

排它网关用于对流程中的决策进行建模。当流程执行到达此网关时,所有分支都将按定义顺序进行判断,选择判断条件结果为真(true)的分支继续处理。

注意:排它网关时只选择一个条件值为 true 的分支进行处理。如果多个分支的条件计算结果都为true,排他网关会选择id值较小的一条分支去执行。

简而言之,就是传递流程变量,排他网关根据流程变量决定该走哪条线路

绘制流程图如下:

duration > 3 走总经理审批,否则走行政审批

启动流程实例
@Autowired
RuntimeService runtimeService;
​
@Test
public void startProcess() {
    //流程变量
    Map<String, Object> varables = new HashMap<>();
    varables.put("duration", 2);
    runtimeService.startProcessInstanceByKey("testExclusiveGateway", varables);
}
查询待办任务
@Autowired
TaskService taskService;
​
@Test
public void findWaitTask() {
    List<Task> list = taskService.createTaskQuery()
            .taskAssignee("wsy")
            .processDefinitionKey("testExclusiveGateway")
            .list();
​
    for (Task task : list) {
        System.out.println("任务id:" + task.getId());
        System.out.println("任务名称:" + task.getName());
        System.out.println("办理人:" + task.getAssignee());
    }
}
流程处理
@Autowired
TaskService taskService;
​
@Test
public void complete() {
    String taskId = "ca89e7f2-be2b-11ed-84bd-38f3abe10e1d";
    taskService.complete(taskId);
}
启动时不指定 duration 请假天数流程变量,在完成直接领导审批时指定流程变量
   @Autowired
RuntimeService runtimeService;
 
@Test
public void startProcess() {
    //启动时不指定 duration 请假天数流程变量,在完成直接领导审批时指定流程变量
    runtimeService.startProcessInstanceByKey("testExclusiveGateway");
}

流程处理

@Autowired
TaskService taskService;
​
​
@Test
public void complete() {
    //流程变量
    Map<String, Object> varables = new HashMap<>();
    varables.put("duration", 5);
    taskService.complete(taskId, varables);
}

流程启动时若不指定流程变量 duration 救会报错找不到 duration 

Unknown property used in expression: ${duration>3}

并行网关 ParallelGateway

并行网关用于对流程中的并发性建模,在流程模型中引入并发性的最简单的网关是并行网关,将流程分成多条分支,然后再多条分支汇聚到一起。

  • 分支(fork):

    并行所有外出顺序流,为每个顺序流都创建一个并发分支。

  • 汇聚(join):

    所有到达并行网关,在此等待的进入分支,只有当所有进入顺序流的分支都到达以后, 流程就会通过汇聚网关。

注意:分支 与 汇聚成对出现 。并行网关不会解析条件,即使顺序流中定义了条件,也会被忽略。并行网关在业务应用中常用于会签任务,会签任务即多个参与者共同办理的任务。

绘制流程如图模型如下:

测试代码如上。。。

包含网关 InclusiveGateway

包含网关可以看做是排他网关和并行网关的结合体。和排他网关一样,你可以在连线上定义条件表达式,定义的表达式会被包含网关解析。但是包含网关主要区别是也可以不指定表达式,同时选择多条分支,这和并行网关是一样的。

简而言之:

  • 排他网关:解析条件,流向条件为 true的节点,或者报错(没有满足条件的)

  • 并行网关:不解析条件, 不报错, 分支节点都执行。

  • 包含网关:有条件就解析条件,条件成立就流向,不成立就不流向,全都不成立报错;没有条件直接流向。

流程绘制如下:

测试代码如上。。。