Flowable-网关

一、网关

网关用来控制流程的流向

(一) 排他网关

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

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

图示:

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

案例:

/**
     * 部署流程
     */
@Test
public void deploy(){
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    RepositoryService repositoryService = processEngine.getRepositoryService();

    Deployment deploy = repositoryService.createDeployment()
    .addClasspathResource("请假流程-排他网关.bpmn20.xml")
    .name("请求流程-排他网关")
    .deploy();
    System.out.println("deploy.getId() = " + deploy.getId());
    System.out.println(deploy.getName());
}

/**
     * 启动流程实例
     */
@Test
public void runProcess(){
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    RuntimeService runtimeService = processEngine.getRuntimeService();
    // 给流程定义中的UEL表达式赋值
    Map<String,Object> variables = new HashMap<>();
    // variables.put("g1","group1");
    variables.put("num",3); // 给流程定义中的UEL表达式赋值
    runtimeService.startProcessInstanceById("holiday-exclusive:1:4",variables);
}


/**
     * 启动流程实例
     */
@Test
public void setVariables(){
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    RuntimeService runtimeService = processEngine.getRuntimeService();
    // 给流程定义中的UEL表达式赋值
    Map<String,Object> variables = new HashMap<>();
    // variables.put("g1","group1");
    variables.put("num",4); // 给流程定义中的UEL表达式赋值
    runtimeService.setVariables("12503",variables);
}



/**
     * 完成任务
     */
@Test
public void completeTask(){
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    TaskService taskService = processEngine.getTaskService();
    Task task = taskService.createTaskQuery()
    //.processInstanceId("2501")
    .processDefinitionId("holiday-exclusive:1:4")
    .taskAssignee("zhangsan")
    .singleResult();
    if(task != null){
        // 完成任务
        taskService.complete(task.getId());
        System.out.println("完成Task");
    }
}

如果从网关出去的线所有条件都不满足的情况下会抛出系统异常,

但是要注意任务没有介绍,还是原来的任务,我们可以重置流程变量

@Test
public void setVariables(){
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    RuntimeService runtimeService = processEngine.getRuntimeService();
    // 给流程定义中的UEL表达式赋值
    Map<String,Object> variables = new HashMap<>();
    // variables.put("g1","group1");
    variables.put("num",4); // 给流程定义中的UEL表达式赋值
    runtimeService.setVariables("12503",variables);
}

前面我们可以直接在连接线上定义条件,那为什么还要有排他网关呢?

直接在线上的情况,如果条件都不满足,流程就结束了,是异常结束!!

(二) 并行网关

并行网关允许将流程分成多条分支,也可以把多条分支汇聚到一起,并行网关的功能是基于进入和外出顺序流的:

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

注意,如果同一个并行网关有多个进入和多个外出顺序流, 它就同时具有分支和汇聚功能。 这时,网关会先汇聚所有进入的顺序流,然后再切分成多个并行分支。

与其他网关的主要区别是,并行网关不会解析条件。即使顺序流中定义了条件,也会被忽略。

案例:

当我们执行了创建请假单后,到并行网关的位置的时候,在ACT_RU_TASK表中就有两条记录

然后同时在ACT_RU_EXECUTION中有三条记录,一个任务对应的有两个执行实例

(三) 包含网关

包含网关可以看做是排他网关和并行网关的结合体。 和排他网关一样,你可以在外出顺序流上定义条件,包含网关会解析它们。 但是主要的区别是包含网关可以选择多于一条顺序流,这和并行网关一样。

包含网关的功能是基于进入和外出顺序流的:

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

(四) 事件网关

事件网关允许根据事件判断流向。网关的每个外出顺序流都要连接到一个中间捕获事件。 当流程到达一个基于事件网关,网关会进入等待状态:会暂停执行。与此同时,会为每个外出顺序流创建相对的事件订阅。

事件网关的外出顺序流和普通顺序流不同,这些顺序流不会真的"执行", 相反它们让流程引擎去决定执行到事件网关的流程需要订阅哪些事件。 要考虑以下条件:

  1. 事件网关必须有两条或以上外出顺序流;
  2. 事件网关后,只能使用intermediateCatchEvent类型(activiti不支持基于事件网关后连接ReceiveTask)
  3. 连接到事件网关的中间捕获事件必须只有一个入口顺序流。

二、结语

以上就是关于flowable网关的介绍,比较常用的就是排查类型的网关。

下一节:flowable-会签与或签 Flowable-会签与或签-CSDN博客

Flowable是一个开源的业务流程管理引擎,排他网关Flowable中一种常用的网关类型,用于在业务流程中进行条件分支。 排他网关通过判断分支条件来选择只满足条件的一条路径进行流程流转。在Flowable中,可以通过XML或者Java代码配置排他网关的条件和分支路径。 配置排他网关时,需要先定义网关节点,并设置节点的唯一标识。然后,通过设置网关节点的出口条件,来定义网关的分支条件。 在XML配置中,可以使用<sequenceFlow>元素来设置分支条件。每个<sequenceFlow>元素都可以设置一个条件表达式,用来判断该分支是否符合条件。条件表达式可以使用Flowable提供的表达式语言,如${var == 1}或${var > 10}。 在Java代码配置中,可以使用Flowable提供的API来设置分支条件。通过调用org.flowable.bpmn.model.SequenceFlow类的条件方法来设置条件表达式,如sequenceFlow.setConditionExpression("${var == 1}")。 配置排他网关时,还可以设置默认的分支路径。当所有的分支条件均不满足时,流程就会沿着设置的默认路径进行流转。设置默认路径时,只需要在<sequenceFlow>元素的条件中不写表达式即可。 排他网关流程运行时的行为是,首先会根据各个分支条件表达式的结果进行判断,确定满足条件的分支。然后,仅选择满足条件的一条路径,并根据该路径的出口流转至下一个节点。 总之,排他网关Flowable中一种常用的网关类型,用于根据条件进行业务流程的分支判断和流转。通过XML或Java代码配置分支条件和默认路径,可以实现业务流程的灵活控制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值