• Activiti7之网关


    排他网关

    什么是排他网关?

    排他网关(也叫异或(XOR)网关,或叫基于数据的排他网关),用来在流程中实现决策。 

    当流程执行到这个网关,所有分支都会判断条件是否为true,如果为 true 则执行该分支。

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

    为什么要用排他网关?

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

     

    上图中,在连线的condition 条件上设置分支条件。

    缺点:如果条件都不满足,不使用排他网关,流程就结束了(是异常结束)。

    如果 使用排他网关决定分支的走向,如下:

    代码示例

     1     @Test
     2     public void runTask() {
     3         //获取ProcessEngine对象   默认配置文件名称:activiti.cfg.xml  并且configuration的Bean实例ID为processEngineConfiguration
     4         ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
     5         //获取一个TaskService对象
     6         TaskService taskService = processEngine.getTaskService();
     7         //查询代办业务 createTaskQuery查询任务   taskCandidateOrAssigned查询任务执行者   processDefinitionKey:查询流程
     8         /**
     9          * taskCandidateOrAssigned匹配规则:1.Assigned   2.配置bpmn文件中定义的值
    10          * taskAssignee匹配规则:1.Assigned
    11          */
    12         Task task = taskService.createTaskQuery().taskAssignee("lisi").processDefinitionKey("exclusiveGateway").singleResult();
    13         System.out.println("任务名称:" + task.getName());
    14         System.out.println("任务执行人:" + task.getAssignee());
    15         System.out.println("任务ID:" + task.getId());
    16         //设置流程变量
    17         //设置请假天数
    18         Integer day=2;
    19         taskService.setVariable(task.getId(),"num",day);
    20         //处理任务
    21         taskService.complete(task.getId());
    22         System.out.println("流程实例ID:" + task.getProcessInstanceId());
    23         
    24     }
    排他网关

    设置天数为2天,运行成功

     在数据库中,直接到人事记录

     

    设置天数为3天 运行失败,因为我的条件是大于3或者小于3,没有等于3所以就会抱一个org.activiti.engine.ActivitiException

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

     

    设置天数为4天,运行成功

    在数据库中的任务进度,是总经理审批 

    并行网关

    什么是并行网关?

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

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

    注意:如果同一个并行网关有多个进入和多个外出顺序流,它就同时具有分支和汇聚功能。

    这时,网关会先汇聚所有进入的顺序流,然后再切分成多个并行分支。

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

    流程图

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

     

     

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

    当将财务会计这个任务执行玩后

    然后将行政考勤这个任务执行玩后,整个请假流程执行完毕

     查看历史

    包含网关

    什么是包含网关?

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

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

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

    代码示例

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

    员工类型:

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

     首先是普通员工,执行完领取请假单之后进入,常规体检和抽血化验

    执行抽血化验之后可以吃早餐

    执行常规体检

     执行吃早餐

    领导,执行完领取请假单之后进入,常规体检和抽血化验以及附加项体检

  • 相关阅读:
    Linux切换到su超级用户
    使用Qt ARM交叉编译提示“此qt版本具有一个未知的工具链”
    使用qwt提示error LNK2001 问题的解决方法
    JavaScript中的 in
    JavaScript中的this
    autocad2010指令全集
    Proj.NETProj.NET简介和示例(转载)
    高性能地图优化策略(转载)
    Emgu.CV,OpenCV for C#
    C# 转载网络爬虫
  • 原文地址:https://www.cnblogs.com/wishsaber/p/12661559.html
Copyright © 2020-2023  润新知