复习步骤19- 23 BPMN其他元素(1)子流程

 

 

          BPMN其他元素(1)子流程

子流程介绍

  • 嵌入式子流程
  • 调用式子流程
  • 事件子流程
  • 事务子流程
  • 特别子流程

 

一、嵌入式子流程

 

   1.1  参照如上图 创建嵌入式子流程流程图EmbededSubProcess.bpmn,并创建Sub Task这个服务流程对应的JAVA类(ErrorJavaDelegate 实现JavaDelegate重写方法execute抛出错误(new BpmnError("myError"))已让错误边界事件捕获)

     新建 EmbededSubProcess.bpmn

 

              新建ErrorJavaDelegate.java

package com.xiangshuai.act.c22;

 

import org.activiti.engine.delegate.DelegateExecution;

import org.activiti.engine.delegate.JavaDelegate;

import org.activiti5.engine.delegate.BpmnError;

 

public class ErrorJavaDelegate implements JavaDelegate{

 

         @Override

         public void execute(DelegateExecution arg0) {

                  System.out.println("执行子流程Service Task的Java Delegate, 抛出错误");

                  throw new BpmnError("myError");

         }

}

      1.2 修改 EmbededSubProcess.bpmn

 

      1.3 测试方法

/*

    嵌入式子流程 test

    创建嵌入式子流程流程图EmbededSubProcess.bpmn,并创建Sub Task这个服务流程对应的JAVA

    ErrorJavaDelegate 实现JavaDelegate重写方法execute抛出错误(new BpmnError("myError"))已让错误边界事件捕获)

    */

   public  static void testPropertyInjection(){

    ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();

        // 存储服务

        RepositoryService rs = engine.getRepositoryService();

        // 运行时服务

        RuntimeService runService = engine.getRuntimeService();

        // 任务服务

        TaskService taskService = engine.getTaskService();

        Deployment dep = rs.createDeployment().addClasspathResource("EmbededSubProcess.bpmn").deploy();

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

       

        // 启动流程

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

       

      /*

        启动流程,自动执行完 ServiceTask对应的JAVAErrorJavaDelegate 执行其重写方法execute 输出System.out.println("执行子流程Service TaskJava Delegate, 抛出错误");

        后抛出new BpmnError("myError"); 错误让 错误边界事件扑捉到,改变其原有流程,走到 Error Task节点

        */

        //

        Task task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();//获得当前执行节点

        System.out.println("当前 节点为"+ task.getName());//当前 节点为Error Task

    }

 

 

 

 

二、调用式子流程 :对于一个流程会被多个流程调用,那么可以把这个流程弄成调用式

子流程供别的流程调用

 如下图,这个审批流程会被多个流程调用,那么我们新建一个此 调用式

子流程

 

子流程

 

 

比如如果员工请假需要 走如上审批流程,那么只需要加个CallActivity节点流程,并在此节点便签加个属性 calledElement="审批流程process标签的Id"即可

 

    2.1 参照上两图新建 一个调用式子流程CallActivitySub.bpmn 和调用流程Offwork.bpmn

               新建调用式子流程 CallActivitySub.bpmn

 

         修改 CallActivitySub.bpmn

 

     修改 Offwork.bpmn ,更改Offwork.bpmn 的 callActivity标签 加个calledElement=" callActivitySub " 属性--这个callActivitySubCallActivitySub.bpmn的<process id

 

      

2.2 测试方法

/***

    * 测试 调用   调用式子流程 ,只要注意,在员工填写完,走callActivity 调用子流程后

    * 会生成两个流程实例--ProcessInstance ,一子(调用式子流程)一父 即可

    * 获得子流程实例的方法    Task task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();

    */

   public  static void testCallActivity(){

       ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();

       // 存储服务

       RepositoryService rs = engine.getRepositoryService();

       // 运行时服务

       RuntimeService runService = engine.getRuntimeService();

       // 任务服务

       TaskService taskService = engine.getTaskService();

       Deployment dep = rs.createDeployment()

               .addClasspathResource("CallActivitySub.bpmn")

               .addClasspathResource("Offwork.bpmn").deploy();

       ProcessDefinition pd = rs.createProcessDefinitionQuery()

               .deploymentId(dep.getId()).processDefinitionKey("myProcess").singleResult();

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

      

       System.out.println(pi.getId());

      

      

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

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

      

       taskService.complete(task.getId());

      

       //调用 子流程会生成两个流程实例,下面是获得调用式子流程 的方法

       ProcessInstance piSub = runService.createProcessInstanceQuery().superProcessInstanceId(pi.getId()).singleResult();

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

      

       System.out.println("当前任务名称:" + task.getName()); //子流程的总监审批节点

      

       /**

        * 输出:27508

           当前任务名称:员工填写

           当前任务名称:总监审批

        * */

   }

 

 

三、事件子流程

 

四、事务子流程

 

可参照之前写的这个流程图的代码

 

五、特别子流程

 

 

测试java类 SubProcessTest.java

package com.xiangshuai.act.c22;

 

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.delegate.DelegateTask;

import org.activiti.engine.repository.Deployment;

import org.activiti.engine.repository.ProcessDefinition;

import org.activiti.engine.runtime.ProcessInstance;

import org.activiti.engine.task.Task;

import org.activiti.engine.task.TaskQuery;

import org.activiti5.engine.delegate.BpmnError;

 

 

/**

 * @author lqx

 *  BPMN其他元素(1)子流程

子流程介绍

    嵌入式子流程

    调用式子流程

    事件子流程

    事务子流程

    特别子流程

 

    文件在 E:\学习文档子目录压缩\框架\工作流引擎\Activiti6.0\window\复习步骤19- 23 BPMN其他元素(1)子流程

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

 */

public class SubProcessTest {

         public static void main(String[] args) {

                  //testPropertyInjection();

                  testCallActivity();

         }

          

   /*

         嵌入式子流程 test

         创建嵌入式子流程流程图EmbededSubProcess.bpmn,并创建Sub Task这个服务流程对应的JAVA类

       (ErrorJavaDelegate 实现JavaDelegate重写方法execute抛出错误(new BpmnError("myError"))已让错误边界事件捕获)

         */

   public  static void testPropertyInjection(){

      ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();

        // 存储服务

        RepositoryService rs = engine.getRepositoryService();

        // 运行时服务

        RuntimeService runService = engine.getRuntimeService();

        // 任务服务

        TaskService taskService = engine.getTaskService();

        Deployment dep = rs.createDeployment().addClasspathResource("EmbededSubProcess.bpmn").deploy();

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

       

        // 启动流程

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

       

      /*

        启动流程,自动执行完 ServiceTask对应的JAVA类ErrorJavaDelegate 执行其重写方法execute 输出System.out.println("执行子流程Service Task的Java Delegate, 抛出错误");

        后抛出new BpmnError("myError"); 错误让 错误边界事件扑捉到,改变其原有流程,走到 Error Task节点

        */

        //

        Task task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();//获得当前执行节点

        System.out.println("当前 节点为"+ task.getName());//当前 节点为Error Task

    }

  

   /***

    * 测试 调用   调用式子流程 ,只要注意,在员工填写完,走callActivity 调用子流程后

    * 会生成两个流程实例--ProcessInstance ,一子(调用式子流程)一父 即可

    * 获得子流程实例的方法    Task task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();

    */

   public  static void testCallActivity(){

            ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();

       // 存储服务

       RepositoryService rs = engine.getRepositoryService();

       // 运行时服务

       RuntimeService runService = engine.getRuntimeService();

       // 任务服务

       TaskService taskService = engine.getTaskService();

       Deployment dep = rs.createDeployment()

               .addClasspathResource("CallActivitySub.bpmn")

               .addClasspathResource("Offwork.bpmn").deploy();

       ProcessDefinition pd = rs.createProcessDefinitionQuery()

               .deploymentId(dep.getId()).processDefinitionKey("myProcess").singleResult();

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

      

       System.out.println(pi.getId());

      

      

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

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

      

       taskService.complete(task.getId());

      

       //调用 子流程会生成两个流程实例,下面是获得调用式子流程 的方法

       ProcessInstance piSub = runService.createProcessInstanceQuery().superProcessInstanceId(pi.getId()).singleResult();

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

      

       System.out.println("当前任务名称:" + task.getName()); //子流程的总监审批节点

      

       /**

        * 输出:27508

                          当前任务名称:员工填写

                          当前任务名称:总监审批

        * */

   }

  

}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值