复习步骤14- BPMN事件(5)中间事件

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiangshuai198807/article/details/89843110

 

中间事件(有的是捕获,有的是抛出,有的既是抛出也是捕获)

  • 定时器中间事件(捕获事件)
  • 信号中间事件(既是抛出也可是捕获事件)
  • 消息中间事件(捕获事件)

 

事件的学习掌握两点:什么时候会被触发,触发后有什么后果

一、定时器中间事件

测试当我下订单后,5秒后去卖家发货节点(在 下订单 与 卖家发货  用定时器中间事件隔开5秒后执行,就触发定时器中间事件让卖家发货节点进行处理

   1.1 新建 timer-intermediate-event-test.bpmn

1.2 修改 timer-intermediate-event-test.bpmn

设置触发定时器中间事件 设为5 秒钟

 

1.3  修改activiti.cfg.xml

 

1.4 测试代码

 

//测试 定时器中间事件

    public static void timerIntermediateEventTest(){

       ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();

        // 存储服务

        RepositoryService rs = engine.getRepositoryService();

        // 运行时服务

        RuntimeService runService = engine.getRuntimeService();

       

        TaskService taskService = engine.getTaskService();

       

        Deployment dep = rs.createDeployment().addClasspathResource("timer-intermediate-event-test.bpmn").deploy();

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

       

        ProcessInstance pi = runService.startProcessInstanceById(pd.getId()); //开始流程

       

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

       

        if("下订单".equals(task.getName())){//启动流程开始节点 自动走到签订查看 节点 ,让其完成节点走下一个节点

           System.out.println("下订单当前节点是 "+task.getName());

           taskService.complete(task.getId());

           SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式

            System.out.println("当前时间是--"+df.format(new Date()));// new Date()为获取当前系统时间

       }

      

       

        try {

           Thread.sleep(10*1000);

       } catch (InterruptedException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }

        //在下订单 节点complete 5秒后,就会触发 <timeDuration>PT5S</timeDuration> 跳到 卖家发货 节点

       

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

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

           /* 输出结果

           下订单当前节点是 下订单

           当前时间是--2019-04-22 14:22:59

           当前任务是 卖家发货

            */

    }

 

 

二、信号中间事件(既是抛出也可是捕获事件)

 

          二.一  测试信号中间捕获事件,测试案例如下

 

        2.1.1  参照上图新建信号捕获事件流程 catch-signal-intermediate-event-test.bpmn

     2.1.2  生成上图 系统生成菜单对应的处理类 CatchSignalDelegate.java

package com.xiangshuai.act.c17;

 

import org.activiti.engine.delegate.DelegateExecution;

import org.activiti.engine.delegate.JavaDelegate;

 

public class CatchSignalDelegate implements JavaDelegate {

 

         @Override

         public void execute(DelegateExecution arg0) {

          System.out.println("系统已生成菜单,等待用户支付");

         }

 

}

   2.1.3 修改 catch-signal-intermediate-event-test.bpmn,将处理类放入 等待生成菜单流程节点,并定义信号,并放入信号中间捕获事件节点

 

   2.1.4 测试代码

  /*测试 单测信号中间捕获事件  --- 整个流程设计

     * 开始节点 -->自动执行了子定义类->完成系统生成菜单(执行不了有信号中间事件卡着),此时有用户支付一条task任务流程(task表中,执行流表中有二条)

     * ->在用户支付节点 runService.signalEventReceived("单测信号中间捕获事件") 发信号,事件触发-》用户支付,系统完成订单节点 ,全部complete-》结束节点

     * */

    public static void catchSignalEventTest(){

       ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();

       // 存储服务

       RepositoryService rs = engine.getRepositoryService();

       // 运行时服务

       RuntimeService runService = engine.getRuntimeService();

      

       TaskService taskService = engine.getTaskService();

      

       Deployment dep = rs.createDeployment().addClasspathResource("catch-signal-intermediate-event-test.bpmn").deploy();

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

      

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

      

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

       taskService.complete(task.getId());//选择商品,直接complete调到下一个并行网关

      

        

        List<Task> list = taskService.createTaskQuery().processInstanceId(pi.getId()).list();

        list.forEach((temptask)->{//只有 用户支付一条任务流程,因为系统完成订单(前面还卡着中间事件,中间事件并不是任务) 一条task任务流程(task表中,执行流表中有二条)

            if("用户支付".equals(temptask.getName())){//先执行完系统生成菜单节点,再发信号给中间事件,改变执行执行流程

               System.out.println("用户支付节点执行--id"+temptask.getId());

               runService.signalEventReceived("单测信号中间捕获事件");//  <signal id="catchSignalTest" name="单测信号中间捕获事件"></signal>

            }

        });

        

        list = taskService.createTaskQuery().processInstanceId(pi.getId()).list();

        list.forEach((temptask)->{// 用户支付,系统完成订单 两条task任务流程(task表中,执行流表中有三条)

            System.out.println("还剩下的节点有"+temptask.getName());

            taskService.complete(temptask.getId());

        });

        

      

       /*

            系统已生成菜单,等待用户支付

             用户支付节点执行--id13

            还剩下的节点有用户支付

            还剩下的节点有系统完成订单

            */

        

      

  

       二.二  测试信号中间捕获事件和抛出事件一起测,测试案例如下

 

 

  这个流程图设计的目的是:选择商品节点完成后 并行网关三个excecute跑,系统生成菜订单自动执行完后和第三条线都有 信号中间捕获事件堵着,等着用户支付完成后自动吃法信号中间抛出时间发信号给他俩

       2.2.1参照上图新建信号捕获和抛出事件测试流程 catchAndThrow-signal-intermediate-event-test.bpmn

 

      2.2.2  生成上图 系统生成菜单对应的处理类 CatchAndThrow   SignalDelegate.java

package com.xiangshuai.act.c17;

 

import org.activiti.engine.delegate.DelegateExecution;

import org.activiti.engine.delegate.JavaDelegate;

 

public class CatchAndThrowSignalDelegate implements JavaDelegate {

 

    @Override

    public void execute(DelegateExecution arg0) {

          System.out.println("系统已生成菜单--信号捕获和抛出事件测试,等待用户支付");

    }

}

 

       2.2.3 修改 catchAndThrow-signal-intermediate-event-test.bpmn

,将处理类放入 等待生成菜单流程节点,并定义信号,并放入两个信号中间捕获事件节点和中间抛出事件节点

 

   2.2.4 测试代码

/*同时测试信号中间捕获和抛出事件  ---

     * 个流程图设计的目的是:选择商品节点完成后 并行网关三个excecute

     * ,系统生成菜订单自动执行完后和第三条线都有 信号中间捕获事件堵着

     * ,等着用户支付完成后自动吃法信号中间抛出时间发信号给他俩

     * */

    public static void catchAndThrowSignalEventTest(){

       ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();

       // 存储服务

       RepositoryService rs = engine.getRepositoryService();

       // 运行时服务

       RuntimeService runService = engine.getRuntimeService();

      

       TaskService taskService = engine.getTaskService();

      

       Deployment dep = rs.createDeployment().addClasspathResource("catchAndThrow-signal-intermediate-event-test.bpmn").deploy();

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

      

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

      

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

       taskService.complete(task.getId());//选择商品,直接complete调到下一个并行网关

      

      

       List<Task> list = taskService.createTaskQuery().processInstanceId(pi.getId()).list();

       list.forEach((temptask)->{//只有 用户支付一条任务流程,因为系统完成订单和第三条执行流程(前面还卡着中间事件,中间事件并不是任务) 一条task任务流程(task表中,执行流表中有四条)

           if("用户支付".equals(temptask.getName())){//执行完用户支付流程节点,自动发信号给两中间捕获事件

              System.out.println("用户支付节点执行--id"+temptask.getId());

              taskService.complete(temptask.getId());

           }

       });

      

       list = taskService.createTaskQuery().processInstanceId(pi.getId()).list();

       list.forEach((temptask)->{//只有 系统完成订单 一条task任务流程

           System.out.println("还剩下的节点有"+temptask.getName());

           taskService.complete(temptask.getId());

       });

      

      

       /* 输出

        * 系统已生成菜单--信号捕获和抛出事件测试,等待用户支付

           用户支付节点执行--id14

           还剩下的节点有系统完成订单

 

        */

    }

 

 

IntermediateEventTest.java

package com.xiangshuai.act.c17;

 

 

 

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.List;

 

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\复习步骤14- BPMN事件(5)中间事件

 * 或 我的网盘\我的笔记\学习文档子目录压缩\框架\工作流引擎\Activiti6.0\window\复习步骤14- BPMN事件(5)中间事件

 */

public class IntermediateEventTest {

    public static void main(String[] args) {

             //timerIntermediateEventTest();

       //catchSignalEventTest();

             catchAndThrowSignalEventTest();

            

         }

   

   

    //测试 定时器中间事件

    public static void timerIntermediateEventTest(){

             ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();

        // 存储服务

        RepositoryService rs = engine.getRepositoryService();

        // 运行时服务

        RuntimeService runService = engine.getRuntimeService();

       

        TaskService taskService = engine.getTaskService();

       

        Deployment dep = rs.createDeployment().addClasspathResource("timer-intermediate-event-test.bpmn").deploy();

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

       

        ProcessInstance pi = runService.startProcessInstanceById(pd.getId()); //开始流程

       

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

       

        if("下订单".equals(task.getName())){//启动流程开始节点 自动走到签订查看 节点 ,让其完成节点走下一个节点

                     System.out.println("下订单当前节点是 "+task.getName());

                     taskService.complete(task.getId());

                     SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式

            System.out.println("当前时间是--"+df.format(new Date()));// new Date()为获取当前系统时间

             }

      

       

        try {

                          Thread.sleep(10*1000);

                  } catch (InterruptedException e) {

                          // TODO Auto-generated catch block

                          e.printStackTrace();

                  }

        //在下订单 节点complete 5秒后,就会触发 <timeDuration>PT5S</timeDuration> 跳到 卖家发货 节点

       

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

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

                /* 输出结果

                  下订单当前节点是 下订单

                          当前时间是--2019-04-22 14:22:59

                          当前任务是 卖家发货

                 */

    }

   

    /*测试 单测信号中间捕获事件  --- 整个流程设计 为

     * 开始节点 -->自动执行了子定义类->完成系统生成菜单(执行不了有信号中间事件卡着),此时有用户支付一条task任务流程(task表中,执行流表中有二条)

     * ->在用户支付节点 runService.signalEventReceived("单测信号中间捕获事件") 发信号,事件触发-》用户支付,系统完成订单节点 ,全部complete-》结束节点

     * */

    public static void catchSignalEventTest(){

             ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();

             // 存储服务

             RepositoryService rs = engine.getRepositoryService();

             // 运行时服务

             RuntimeService runService = engine.getRuntimeService();

            

             TaskService taskService = engine.getTaskService();

            

             Deployment dep = rs.createDeployment().addClasspathResource("catch-signal-intermediate-event-test.bpmn").deploy();

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

            

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

            

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

             taskService.complete(task.getId());//选择商品,直接complete调到下一个并行网关

            

              

              List<Task> list = taskService.createTaskQuery().processInstanceId(pi.getId()).list();

              list.forEach((temptask)->{//只有 用户支付一条任务流程,因为系统完成订单(前面还卡着中间事件,中间事件并不是任务) 一条task任务流程(task表中,执行流表中有二条)

                      if("用户支付".equals(temptask.getName())){//先执行完系统生成菜单节点,再发信号给中间事件,改变执行执行流程

                               System.out.println("用户支付节点执行--》id为"+temptask.getId());

                               runService.signalEventReceived("单测信号中间捕获事件");//  <signal id="catchSignalTest" name="单测信号中间捕获事件"></signal>

                      }

              });

              

              list = taskService.createTaskQuery().processInstanceId(pi.getId()).list();

              list.forEach((temptask)->{//有 用户支付,系统完成订单 两条task任务流程(task表中,执行流表中有三条)

                      System.out.println("还剩下的节点有"+temptask.getName());

                  taskService.complete(temptask.getId());

              });

              

            

             /*

                 系统已生成菜单,等待用户支付

             用户支付节点执行--》id为13

            还剩下的节点有用户支付

            还剩下的节点有系统完成订单

                 */

    }

    

    /*同时测试信号中间捕获和抛出事件  ---

     * 个流程图设计的目的是:选择商品节点完成后 并行网关三个excecute跑

     * ,系统生成菜订单自动执行完后和第三条线都有 信号中间捕获事件堵着

     * ,等着用户支付完成后自动吃法信号中间抛出时间发信号给他俩

     * */

    public static void catchAndThrowSignalEventTest(){

             ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();

             // 存储服务

             RepositoryService rs = engine.getRepositoryService();

             // 运行时服务

             RuntimeService runService = engine.getRuntimeService();

            

             TaskService taskService = engine.getTaskService();

            

             Deployment dep = rs.createDeployment().addClasspathResource("catchAndThrow-signal-intermediate-event-test.bpmn").deploy();

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

            

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

            

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

             taskService.complete(task.getId());//选择商品,直接complete调到下一个并行网关

            

            

             List<Task> list = taskService.createTaskQuery().processInstanceId(pi.getId()).list();

             list.forEach((temptask)->{//只有 用户支付一条任务流程,因为系统完成订单和第三条执行流程(前面还卡着中间事件,中间事件并不是任务) 一条task任务流程(task表中,执行流表中有四条)

                     if("用户支付".equals(temptask.getName())){//执行完用户支付流程节点,自动发信号给两中间捕获事件

                              System.out.println("用户支付节点执行--》id为"+temptask.getId());

                              taskService.complete(temptask.getId());

                     }

             });

            

             list = taskService.createTaskQuery().processInstanceId(pi.getId()).list();

             list.forEach((temptask)->{//只有 系统完成订单 一条task任务流程

                     System.out.println("还剩下的节点有"+temptask.getName());

                     taskService.complete(temptask.getId());

             });

            

            

             /* 输出

              * 系统已生成菜单--信号捕获和抛出事件测试,等待用户支付

                          用户支付节点执行--》id为14

                          还剩下的节点有系统完成订单

 

              */

    }

 

}

 

 

 

猜你喜欢

转载自blog.csdn.net/xiangshuai198807/article/details/89843110
今日推荐