Activiti7 網關(排他網關)


什么是排他網關?

排他網關(也叫異或(XOR)網關,或叫基於數據的排他網關),用於在流程中實現決策,當流程執行到這個網關,所有分支都會判斷條件是否為true,如果為true則執行該分支

注意:排他網關只會選擇一個為true的分支執行.(即使有兩個分支條件都為true,排他網關也會只選擇一條分支去執行)

為什么要用排他網關?

不用排他網關也能實現分支

 

 在連線的condition條件上設置分支條件

缺點:

如果條件都不滿足,不使用排他網關,流程就結束了(異常結束)

如果使用排他網關決定分支的走向

 

 如果從網關出去的線所有條件都不滿足則系統拋出異常

org.activiti.engine.ActivitiException: No outgoing sequence flow of the exclusive gateway 'exclusivegateway1' could be selected for continuing the process
at org.activiti.engine.impl.bpmn.behavior.ExclusiveGatewayActivityBehavior.leave(ExclusiveGatewayActivityBehavior.java:85)

說明:經過排他網關必須要有一條且只有一條分支走.

 

畫圖:

其他的都一樣就是添加了一個排他網關

 

 部署->啟動->提交任務

package com.itheima.test;

import com.itheima.activiti.pojo.Holiday;
import org.activiti.engine.*;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Before;
import org.junit.Test;

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

/**
 * 網關測試
 */
public class ActivitiGatewayTest {

    ProcessEngine defaultProcessEngine;

    @Before
    public void init() {
        defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
    }

    /**
     * 部署流程定義
     */
    @Test
    public void deployment(){
        RepositoryService repositoryService = defaultProcessEngine.getRepositoryService();

        Deployment deploy = repositoryService.createDeployment()
                .addClasspathResource("pic/gateway/holidayGateway1.bpmn")
                .addClasspathResource("pic/gateway/holidayGateway1.png")
                .name("請假流程")
                .deploy();

        System.out.println(deploy);
    }

    /**
     * 啟動流程實例
     */
    @Test
    public void startProcessInstance(){

        RuntimeService runtimeService = defaultProcessEngine.getRuntimeService();

        Map<String,Object> map = new HashMap<>();

        Holiday holiday = new Holiday();
        holiday.setNum(5F);

        map.put("holiday",holiday);

        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess_1", map);

        System.out.println(processInstance);

    }

    /**
     * 提交任務
     */
    @Test
    public void completTask(){
        String assignee = "lisi";
        Task task = querySingResultByAssignee(assignee);
        TaskService taskService = defaultProcessEngine.getTaskService();
        taskService.complete(task.getId());
    }

    /**
     * 查詢用戶唯一任務
     * @param assignee
     * @return
     */
    public Task querySingResultByAssignee(String assignee){
        TaskService taskService = defaultProcessEngine.getTaskService();
        return taskService.createTaskQuery().processDefinitionKey("myProcess_1").taskAssignee(assignee).singleResult();
    }
}

提交完部門經理審批后因為兩個判斷都成立,於是走ID號小的流程,只會走一個

當多個條件同時成立的時候,會選擇ID最小的一個流程走,當條件都不成立的時候,排他網關也沒招,只能報錯

作者:彼岸舞

時間:2020\09\07

內容關於:Activiti工作流

本文來源於網絡,只做技術分享,一概不負任何責任


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM