(7)Flowable网关

文章详细介绍了BPMN中的四种网关类型:排他网关用于决策,选择第一条符合条件的路径;并行网关实现流程分支与合并;包容网关结合了排他与并行网关的特点,可以同时选择多个出口;事件网关则根据事件来决定流程走向。Flowable框架中的这些网关机制帮助构建灵活的业务流程。
摘要由CSDN通过智能技术生成

参考:https://tkjohn.github.io/flowable-userguide/#bpmnGateways

网关(gateway)用于控制执行的流向。

排他网关

排他网关(exclusive gateway)(也叫异或网关 XOR gateway,或者更专业的,基于数据的排他网关 exclusive data-based gateway),用于对流程中的决策建模。当执行到达这个网关时,会按照所有出口顺序流定义的顺序对它们进行计算。选择第一个条件计算为true的顺序流(当没有设置条件时,认为顺序流为true)继续流程。

请注意这里出口顺序流的含义与BPMN 2.0中的一般情况不一样。一般情况下,会选择所有条件计算为true的顺序流,并行执行。而使用排他网关时,只会选择一条顺序流。当多条顺序流的条件都计算为true时,会且仅会选择在XML中最先定义的顺序流继续流程。如果没有可选的顺序流,会抛出异常。

排他网关用内部带有’X’图标的标准网关(菱形)表示,'X’图标代表异或的含义。请注意内部没有图标的网关默认为排他网关。BPMN 2.0规范不允许在同一个流程中混合使用有及没有X的菱形标志。

在这里插入图片描述

例子:

在这里插入图片描述

这里当num=3的时候,没有可以选的顺序流,会抛出异常。

在这里插入图片描述

此时任务没有结束,此时可以修改这个变量为4。

再进行执行任务,任务正常往下走。

前面我们可以直接在连接线上定义条件,那为什么还要有排他网关呢?直接在线上的情况,如果条件都不满足,流程就结束了,是异常结束

 	/**
     * 部署流程
     */
    @Test
    public void TestDeployment() {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        RepositoryService repositoryService = processEngine.getRepositoryService();
        Deployment deployment  = repositoryService.createDeployment()
                .addClasspathResource("请假流程-排他网关.bpmn20.xml")
                .name("请假流程-排他网关")
                .deploy();

        System.out.println("deployment.getId()" + deployment.getId());
        System.out.println("deployment.getName()" + deployment.getName());
    }

    /**
     * 启动流程实例
     */
    @Test
    public void TestDeploymentRun() {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        RuntimeService runtimeService = processEngine.getRuntimeService();
        // 流程变量
        Map<String, Object> variables = new HashMap<String, Object>();
        variables.put("num", 3);
        // 启动流程实例
        runtimeService.startProcessInstanceById("holiday-exclusive:1:120004", variables);
    }

    /**
     * 完成任务
     */
    @Test
    public void TestCompleteTask() {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        Task task = taskService.createTaskQuery()
                // .processInstanceId("82501") //根据流程实例编号查找
                .processDefinitionId("holiday-exclusive:1:120004")
                .taskAssignee("zhangsan")
                .singleResult();

        if(task != null){
            // 完成任务
            taskService.complete(task.getId());
            System.out.println("完成任务成功");
        }
    }

    /**
     * 修改变量
     */
    @Test
    public void TestUpdateVariables() {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        RuntimeService runtimeService = processEngine.getRuntimeService();
        // 流程变量
        Map<String, Object> variables = new HashMap<String, Object>();
        variables.put("num", 4);
        runtimeService.setVariables("132501", variables);
    }

并行网关

网关也可以建模流程中的并行执行。在流程模型中引入并行的最简单的网关,就是并行网关(parallel gateway)。它可以将执行*分支(fork)为多条路径,也可以合并(join)*多条入口路径的执行。

并行网关的功能取决于其入口与出口顺序流:

  • **分支:**所有的出口顺序流都并行执行,为每一条顺序流创建一个并行执行。
  • **合并:**所有到达并行网关的并行执行都会在网关处等待,直到每一条入口顺序流都到达了有个执行。然后流程经过该合并网关继续。

请注意,如果并行网关同时具有多条入口与出口顺序流,可以同时具有分支与合并的行为。在这种情况下,网关首先合并所有入口顺序流,然后分裂为多条并行执行路径。

与其他网关类型有一个重要区别:并行网关不计算条件。如果连接到并行网关的顺序流上定义了条件,会直接忽略该条件。

并行网关,用内部带有’加号’图标的网关(菱形)表示,代表*与(AND)*的含义。

在这里插入图片描述

例子:

在这里插入图片描述

在创建请假单之后,到并行网关的时候,任务里边有了两个任务,在执行里边有了两个执行,也就是说一个流程实例有了两个执行实例。

在这里插入图片描述

在这里插入图片描述

在技术经理审批之后,任务表里边的对应的它的任务没有了。

在项目经理也审批之后,任务表里边的对应的它的任务也没有了。此时任务表里边看不到这个流程的任务了,执行表里边也看不到这个流程的执行了。

因为我们设置的num=3,所以此时流程已经结束了。

    /**
     * 部署流程
     */
    @Test
    public void TestDeployment() {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        RepositoryService repositoryService = processEngine.getRepositoryService();
        Deployment deployment  = repositoryService.createDeployment()
                .addClasspathResource("请假流程-并行网关.bpmn20.xml")
                .name("请假流程-并行网关")
                .deploy();

        System.out.println("deployment.getId()" + deployment.getId());
        System.out.println("deployment.getName()" + deployment.getName());
    }

    /**
     * 启动流程实例
     */
    @Test
    public void TestDeploymentRun() {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        RuntimeService runtimeService = processEngine.getRuntimeService();
        // 流程变量
        Map<String, Object> variables = new HashMap<String, Object>();
        variables.put("num", 3);
        // 启动流程实例
        runtimeService.startProcessInstanceById("holiday-parallel:1:140004", variables);
    }

    /**
     * 完成任务
     */
    @Test
    public void TestCompleteTask() {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        Task task = taskService.createTaskQuery()
                // .processInstanceId("82501") //根据流程实例编号查找
                .processDefinitionId("holiday-parallel:1:140004")
                .taskAssignee("lisi")
                .singleResult();

        if(task != null){
            // 完成任务
            taskService.complete(task.getId());
            System.out.println("完成任务成功");
        }
    }

包容网关

**包容网关(inclusive gateway)**看做排他网关与并行网关的组合。与排他网关一样,可以在包容网关的出口顺序流上定义条件,包容网关会计算条件。然而主要的区别是,包容网关与并行网关一样,可以同时选择多于一条出口顺序流。

包容网关的功能取决于其入口与出口顺序流:

  • **分支:**流程会计算所有出口顺序流的条件。对于每一条计算为true的顺序流,流程都会创建一个并行执行。
  • **合并:**所有到达包容网关的并行执行,都会在网关处等待。直到每一条具有流程标志(process token)的入口顺序流,都有一个执行到达。这是与并行网关的重要区别。换句话说,包容网关只会等待可以被执行的入口顺序流。在合并后,流程穿过合并并行网关继续。

请注意,如果包容网关同时具有多条入口与出口顺序流,可以同时具有分支与合并的行为。在这种情况下,网关首先合并所有具有流程标志的入口顺序流,然后为每一个条件计算为true的出口顺序流分裂出并行执行路径。

包容网关的汇聚行为比并行网关更复杂。所有到达包容网关的并行执行,都会在网关等待,直到所有“可以到达”包容网关的执行都“到达”包容网关。 判断方法为:计算当前流程实例中的所有执行,检查从其位置是否有一条到达包容网关的路径(忽略顺序流上的任何条件)。如果存在这样的执行(可到达但尚未到达),则不会触发包容网关的汇聚行为。

包容网关,用内部带有’圆圈’图标的网关(菱形)表示。

在这里插入图片描述

例子:

在这里插入图片描述

在启动流程实例的时候,变量num=5。

创建请假单之后,会走项目经理审批、人事审批这两个任务。

在这里插入图片描述

在目经理审批、人事审批审批了之后,任务到达总经理审批节点。

在这里插入图片描述

    /**
     * 部署流程
     */
    @Test
    public void TestDeployment() {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        RepositoryService repositoryService = processEngine.getRepositoryService();
        Deployment deployment  = repositoryService.createDeployment()
                .addClasspathResource("请假流程-包含网关.bpmn20.xml")
                .name("请假流程-包含网关")
                .deploy();

        System.out.println("deployment.getId()" + deployment.getId());
        System.out.println("deployment.getName()" + deployment.getName());
    }

    /**
     * 启动流程实例
     */
    @Test
    public void TestDeploymentRun() {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        RuntimeService runtimeService = processEngine.getRuntimeService();
        // 流程变量
        Map<String, Object> variables = new HashMap<String, Object>();
        variables.put("num", 5);
        // 启动流程实例
        runtimeService.startProcessInstanceById("holiday-inclusive:1:155004", variables);
    }

    /**
     * 完成任务
     */
    @Test
    public void TestCompleteTask() {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        Task task = taskService.createTaskQuery()
                // .processInstanceId("82501") //根据流程实例编号查找
                .processDefinitionId("holiday-inclusive:1:155004")
                .taskAssignee("i1")
                .singleResult();

        if(task != null){
            // 完成任务
            taskService.complete(task.getId());
            System.out.println("完成任务成功");
        }
    }

事件网关

基于事件的网关(event-based gateway)提供了根据事件做选择的方式。网关的每一条出口顺序流都需要连接至一个捕获中间事件。当流程执行到达基于事件的网关时,与等待状态类似,网关会暂停执行,并且为每一条出口顺序流创建一个事件订阅。

请注意:基于事件的网关的出口顺序流与一般的顺序流不同。这些顺序流从不实际执行。相反,它们用于告知流程引擎:当执行到达一个基于事件的网关时,需要订阅什么事件。有以下限制:

  • 一个基于事件的网关,必须有两条或更多的出口顺序流。
  • 基于事件的网关,只能连接至intermediateCatchEvent(捕获中间事件)类型的元素(Flowable不支持在基于事件的网关之后连接“接收任务 Receive Task”)。
  • 连接至基于事件的网关的intermediateCatchEvent,必须只有一个入口顺序流。

基于事件的网关,用内部带有特殊图标的网关(菱形)表示。

在这里插入图片描述

在配置文件中开启定时任务,默认是开启的。

flowable:
  #关闭定时任务JOB
  async-executor-activate: false
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值