zoukankan      html  css  js  c++  java
  • Activiti——网关

    1.排他网关

    排他网关(也叫异或(XOR)网关,或叫基于数据的排他网关),用来在流程中实现决策。 当流程执行到这个网关,所有分支都会判断条件是否为true,如果为 true 则执行该分支,

    注意,排他网关只会选择一个为 true 的分支执行。(即使有两个分支条件都为 true,排他网关也会只选择一条分支去执行)

      1.1为什么要用排他网关?

        不用排他网关也可以实现分支,如下图

        

         

        上图中,在连线的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.ExclusiveGatewayActivityBehav ior.leave(ExclusiveGatewayActivityBehavior.java:85)

        说明 :经过排他网关必须要有一条且只有一条分支走。

    2.并行网关

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

    fork 分支:

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

    join 汇聚:

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

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

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

    财务结算和入库是两个 execution 分支,在 act_ru_execution 表有两条记录分别是财务结算和入库,act_ru_execution 还有一条记录表示该流程实例。

    待财务结算和入库任务全部完成,在汇聚点汇聚,通过 parallelGateway 并行网关。并行网关在业务应用中常用于会签任务,会签任务即多个参与者共同办理的任务。

    测试:

    当执行到并行网关数据库跟踪如下:

    当前任务表:SELECT * FROM act_ru_task #当前任务表

    上图中:有两个(多个)任务当前执行。

    通过流程实例执行表:SELECT * FROM act_ru_execution #流程实例的执行表

    上图中,说明当前流程实例有多个分支(两个)在运行。

    对并行任务的执行:

    并行任务执行不分前后,由任务的负责人去执行即可。

    当完成并行任务中一个任务后:

    已完成的任务在当前任务表act_ru_task_已被删除。

    在流程实例执行表:SELECT * FROM act_ru_execution 有中多个分支存在且有并行网关的汇聚结点。

     

    有并行网关的汇聚结点:说明有一个分支已经到汇聚,等待其它的分支到达。

    当所有分支任务都完成,都到达汇聚结点后:

    流程实例执行表:SELECT * FROM  act_ru_execution,执行流程实例不存在,说明流程执行结束。总结:所有分支到达汇聚结点,并行网关执行完成。

    3.包含网关

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

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

    分支:

    所有外出顺序流的条件都会被解析,结果为 true 的顺序流会以并行方式继续执行, 会为每个顺序流创建一个分支。

    汇聚:

    所有并行分支到达包含网关,会进入等待状态, 直到每个包含流程 token 的进入顺序流的分支都到达。 这是与并行网关的最大不同。换句话说,包含网关只会等待被选中执行了的进入顺序流。

    在汇聚之后,流程会穿过包含网关继续执行。

    案例:

    企业体检流程,公司全体员工进行常规项检查、抽血化验,公司管理层除常规检查和抽血化验还要 进行增加项检查。

    员工类型:

    通过流程变量userType 来表示,如果等于 1 表示普通员工,如果等于 2 表示领导

    注意:通过包含网关的每个分支的连线上设置condition 条件。

     测试:

    如果包含网关设置的条件中,流程变量不存在,报错;

    org.activiti.engine.ActivitiException:  Unknown   property   used in  expression: ${userType=='1' || userType=='2'}

    需要在流程启动时设置流程变量userType

    当执行到包含网关:

    流程实例执行表:SELECT * FROM act_ru_execution

     

    第一条记录:包含网关分支。

    后两条记录:两个分支:常规项体检,抽血化验当前任务表:ACT_RU_TASK_

     

    上图中,常规项体检,抽血化验都是当前的任务,在并行执行。

    如果有一个分支执行到汇聚:

    先走到汇聚结点的分支,要等待其它分支走到汇聚。等所有分支走到汇聚,包含网关就执行完成。

    包含网关执行完成,分支和汇聚就从act_ru_execution 删除。

    小结:在分支时,需要判断条件,符合条件的分支,将会执行,符合条件的分支最终才进行汇聚。

  • 相关阅读:
    学习笔记:javascript 窗口对象(window)
    学习笔记:javascript内置对象:数组对象
    学习笔记:javascript内置对象:日期对象
    学习笔记:javascript内置对象:数学对象
    学习笔记:javascript内置对象:字符串对象
    初次尝试轮播图
    今天我开通了博客园
    javaweb项目运转流程
    idea tomcat启动无效
    mysql事务管理及spring声明式事务中主动异常抛出使数据库回滚
  • 原文地址:https://www.cnblogs.com/chx9832/p/12653055.html
Copyright © 2011-2022 走看看