复习步骤20- BPMN其他元素(2)顺序流与网关

I.顺序流

     条件顺序流 -- 在顺序流里面可以定义表达式,表达式的计算结果是true,顺序流就往这里走了,一般这些顺序流的源对象是网关或流程活动

     默认顺序流 -- 就是条件顺序流 里有一条 不配置 如下的标签<conditionExpression xsi:type="tFormalExpression"><![CDATA[

            ${days <= 3}

            ]]></conditionExpression>

那么如果其他条件顺序流都不满足,就会走默认顺序流

    

 

 

 

 

II.网关

单向网关 :只会选一条路走,注意选那条路走不要加错逻辑即可

并行网关  :几条路同时走

兼容网关 :单向网关和并行网关的结合体

事件网关 :只会选择最先触发的那条路走

组合网关

 

 

一、测试 单向网关+条件顺序流 ,在targetRef="部门经理审批"的这条顺序流---即小于等于5天这条顺序流 < sequenceFlow>标签内上加 条件

<conditionExpression xsi:type="tFormalExpression"><![CDATA[

            ${days <= 3}

            ]]></conditionExpression>

在targetRef="总经理审批"的这条顺序流---即大于5天这条顺序流 < sequenceFlow>标签内上加 条件

<conditionExpression xsi:type="tFormalExpression"><![CDATA[

            ${days > 5}

            ]]></conditionExpression>

 

其中${days > 5} JUEL表达式,需在JAVA代码流程启动时ByKey map参数注入

 

 

    1.1 按上图新建一个流程图 one-way-gateway.bpmn

  1.2 修改  one-way-gateway.bpmn  targetRef="usertask2-部门经理审批", targetRef="usertask3-总经理审批" 这两条sequenceFlow 命名为小于等于5天、大于5天这条顺序流 并分别

在targetRef="部门经理审批"的这条顺序流---即小于等于5天这条顺序流 < sequenceFlow>标签内上加 条件

<conditionExpression xsi:type="tFormalExpression"><![CDATA[

            ${days <= 3}

            ]]></conditionExpression>

在targetRef="总经理审批"的这条顺序流---即大于5天这条顺序流 < sequenceFlow>标签内上加 条件

<conditionExpression xsi:type="tFormalExpression"><![CDATA[

            ${days > 5}

            ]]></conditionExpression>

 

其中${days > 5} JUEL表达式,需在JAVA代码流程启动时ByKey map参数注入

 

1.3 测试代码

/**

     * 测试 单向网关+条件顺序流 ,targetRef="部门经理审批"的这条顺序流---即小于等于5天这条顺序流 < sequenceFlow>标签内上加 条件

<conditionExpression xsi:type="tFormalExpression"><![CDATA[

            ${days <= 3}

            ]]></conditionExpression>

targetRef="总经理审批"的这条顺序流---即大于5天这条顺序流 < sequenceFlow>标签内上加 条件

<conditionExpression xsi:type="tFormalExpression"><![CDATA[

            ${days > 5}

            ]]></conditionExpression>

 

其中${days > 5} JUEL表达式,需在JAVA代码流程启动时ByKey map参数注入

 

     */

    public static void testOneWayGateway(){

       ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();

        // 存储服务

        RepositoryService rs = engine.getRepositoryService();

        // 运行时服务

        RuntimeService runService = engine.getRuntimeService();

        // 任务服务

        TaskService taskService = engine.getTaskService();

        Deployment dep = rs.createDeployment().addClasspathResource("one-way-gateway.bpmn").deploy();

        ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();

       

       

        // 启动流程 ,one-way-gateway.bpmn 中有用到JUEL表达式 days,所以,需要 byKeymap启动

        Map<String,Object> vars=new  HashMap<String,Object>();

        vars.put("days", 3);

        ProcessInstance pi = runService.startProcessInstanceByKey(pd.getKey(), vars);

       

        Task task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();

        System.out.println("当前任务:" + task.getName());

        // 完成第一个任务

        taskService.complete(task.getId());

       

        task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();

        System.out.println("当前任务:" + task.getName());

       

        /*

         * 输出结果:当前任务:填写请假申请

                                       当前任务:部门经理审批

         * */

    }

 

 

 

二、事件网关 :只会选择最先触发的那条路走

 

  2.1 参照上图 新建event-gateway.bpmn

 

 

 2.2 修改 event-gateway.bpmn ,加信号和定时

2.3测试代码

//事件网关 :只会选择最先触发的那条路走--即高级工程师那条流程

    public static void testEventGateway1(){

       ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();

       // 存储服务

       RepositoryService rs = engine.getRepositoryService();

       // 运行时服务

       RuntimeService runService = engine.getRuntimeService();

       // 任务服务

       TaskService taskService = engine.getTaskService();

       Deployment dep = rs.createDeployment().addClasspathResource("event-gateway.bpmn").deploy();

       ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();

      

      

       // 启动流程 --走带 发信号那条流程--即,因为定时器流程要5秒后才触发,所以肯定比这个慢

      

      

       ProcessInstance pi = runService.startProcessInstanceById(pd.getId());

       runService.signalEventReceived("事件网关-发信号");// event-gateway.bpmn <signal id="mySignal" name="事件网关-发信号"></signal>

       Task task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();

       System.out.println("当前任务:" + task.getName());

      

      

       /*

        * 输出结果:

        * 当前任务:高级工程师

        * */

    }

   

   

    //事件网关 :只会选择最先触发的那条路走--初级工程师那条流程

    public static void testEventGateway2(){

       ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();

       // 存储服务

       RepositoryService rs = engine.getRepositoryService();

       // 运行时服务

       RuntimeService runService = engine.getRuntimeService();

       // 任务服务

       TaskService taskService = engine.getTaskService();

       Deployment dep = rs.createDeployment().addClasspathResource("event-gateway.bpmn").deploy();

       ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();

      

      

       // 启动流程 --不走带 发信号那条流程--定时器流程要5秒后才触发,

      

      

       ProcessInstance pi = runService.startProcessInstanceById(pd.getId());

        //runService.signalEventReceived("事件网关-发信号"); 不发信号event-gateway.bpmn <signal id="mySignal" name="事件网关-发信号"></signal>

       try {

           Thread.sleep(8*1000);//8秒,好让初级工程师那条路定时器触发

       } catch (InterruptedException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }

       Task task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();

       System.out.println("当前任务:" + task.getName());

      

       /*

        * 输出结果:

        * 当前任务:初级工程师

        * */

    }

 

 

总测试JAVA GatewayTest.java

package com.xiangshuai.act.c23;

 

import java.util.HashMap;

import java.util.Map;

 

import org.activiti.engine.ProcessEngine;

import org.activiti.engine.ProcessEngines;

import org.activiti.engine.RepositoryService;

import org.activiti.engine.RuntimeService;

import org.activiti.engine.TaskService;

import org.activiti.engine.repository.Deployment;

import org.activiti.engine.repository.ProcessDefinition;

import org.activiti.engine.runtime.ProcessInstance;

import org.activiti.engine.task.Task;

 

 

/**

 * @author lqx

 * 文件在 E:\学习文档子目录压缩\框架\工作流引擎\Activiti6.0\window\复习步骤20-  BPMN其他元素(2)顺序流与网关

 * 或 我的网盘\我的笔记\学习文档子目录压缩\框架\工作流引擎\Activiti6.0\window\复习步骤20-  BPMN其他元素(2)顺序流与网关

 *

 */

public class GatewayTest {

        

    public static void main(String[] args) {

             //testOneWayGateway();

             //testEventGateway11();

             testEventGateway2();

         }

    

    /**

     * 测试 单向网关+条件顺序流 ,在targetRef="部门经理审批"的这条顺序流---即小于等于5天这条顺序流 < sequenceFlow>标签内上加 条件

<conditionExpression xsi:type="tFormalExpression"><![CDATA[

            ${days <= 3}

            ]]></conditionExpression>

在targetRef="总经理审批"的这条顺序流---即大于5天这条顺序流 < sequenceFlow>标签内上加 条件

<conditionExpression xsi:type="tFormalExpression"><![CDATA[

            ${days > 5}

            ]]></conditionExpression>

 

其中${days > 5} 是JUEL表达式,需在JAVA代码流程启动时ByKey map参数注入

 

     */

    public static void testOneWayGateway(){

             ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();

        // 存储服务

        RepositoryService rs = engine.getRepositoryService();

        // 运行时服务

        RuntimeService runService = engine.getRuntimeService();

        // 任务服务

        TaskService taskService = engine.getTaskService();

        Deployment dep = rs.createDeployment().addClasspathResource("one-way-gateway.bpmn").deploy();

        ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();

       

       

        // 启动流程 ,one-way-gateway.bpmn 中有用到JUEL表达式 days,所以,需要 byKey带map启动

        Map<String,Object> vars=new  HashMap<String,Object>();

        vars.put("days", 3);

        ProcessInstance pi = runService.startProcessInstanceByKey(pd.getKey(), vars);

       

        Task task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();

        System.out.println("当前任务:" + task.getName());

        // 完成第一个任务

        taskService.complete(task.getId());

       

        task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();

        System.out.println("当前任务:" + task.getName());

       

        /*

         * 输出结果:当前任务:填写请假申请

                                       当前任务:部门经理审批

         * */

    }

   

   

    //事件网关 :只会选择最先触发的那条路走--即高级工程师那条流程

    public static void testEventGateway1(){

             ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();

             // 存储服务

             RepositoryService rs = engine.getRepositoryService();

             // 运行时服务

             RuntimeService runService = engine.getRuntimeService();

             // 任务服务

             TaskService taskService = engine.getTaskService();

             Deployment dep = rs.createDeployment().addClasspathResource("event-gateway.bpmn").deploy();

             ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();

            

            

             // 启动流程 --走带 发信号那条流程--即,因为定时器流程要5秒后才触发,所以肯定比这个慢

            

            

             ProcessInstance pi = runService.startProcessInstanceById(pd.getId());

             runService.signalEventReceived("事件网关-发信号");// event-gateway.bpmn <signal id="mySignal" name="事件网关-发信号"></signal>

             Task task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();

             System.out.println("当前任务:" + task.getName());

            

            

             /*

              * 输出结果:

              * 当前任务:高级工程师

              * */

    }

   

   

    //事件网关 :只会选择最先触发的那条路走--初级工程师那条流程

    public static void testEventGateway2(){

             ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();

             // 存储服务

             RepositoryService rs = engine.getRepositoryService();

             // 运行时服务

             RuntimeService runService = engine.getRuntimeService();

             // 任务服务

             TaskService taskService = engine.getTaskService();

             Deployment dep = rs.createDeployment().addClasspathResource("event-gateway.bpmn").deploy();

             ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();

            

            

             // 启动流程 --不走带 发信号那条流程--定时器流程要5秒后才触发,

            

            

             ProcessInstance pi = runService.startProcessInstanceById(pd.getId());

              //runService.signalEventReceived("事件网关-发信号"); 不发信号event-gateway.bpmn <signal id="mySignal" name="事件网关-发信号"></signal>

             try {

                          Thread.sleep(8*1000);//睡8秒,好让初级工程师那条路定时器触发

                  } catch (InterruptedException e) {

                          // TODO Auto-generated catch block

                          e.printStackTrace();

                  }

             Task task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();

             System.out.println("当前任务:" + task.getName());

            

             /*

              * 输出结果:

              * 当前任务:初级工程师

              * */

    }

   

   

   

   

    

}

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值