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 删除。

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

  • 相关阅读:
    poj 3528 (三维几何求凸包+凸包表面积)
    dijkstra模板(好像是斐波那契额堆优化,但我为什么看起来像优先队列优化,和spfa一样)
    最大空凸包模板
    ICPC 2017–2018, NEERC, Northern Subregional Contest St Petersburg, November 4, 2017 I题
    hdu 5248 序列变换
    hdu 2063(二分图模板测试)
    组合数
    85. Maximal Rectangle 由1拼出的最大矩形
    750. Number Of Corner Rectangles四周是点的矩形个数
    801. Minimum Swaps To Make Sequences Increasing 为使两个数组严格递增,所需要的最小交换次数
  • 原文地址:https://www.cnblogs.com/chx9832/p/12653055.html
Copyright © 2011-2022 走看看