复习步骤21- 25 BPMN其他元素(3)流程活动的特性

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

多实例流程活动

 

设置循环数据

  在要循环的流程节点中加入下标签,表示循环执行

       后台设置循环数据

 

跳出循环

如上图加标签就是执行2次就会跳出循环

 

补偿处理者

 

 

一、参照下图,弄个最简单的循环执行这个Service  Task节点

 1.1 新建 foreach-test1.bpmn

 1.2 修改foreach-test1.bpmn -- 给Service Task 加如下标签,让其执行5次

 

1.3测试方法

/**

     * 测试最简单的循环执行这个Service  Task节点

     *  <serviceTask id="servicetask1" name="Service Task">

          <multiInstanceLoopCharacteristics

               isSequential="false" >

               <loopCardinality>5</loopCardinality>

          </multiInstanceLoopCharacteristics>

    </serviceTask>

     */

    public static void testForeachTest1(){

       ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();

       // 存储服务

       RepositoryService rs = engine.getRepositoryService();

       // 运行时服务

       RuntimeService runService = engine.getRuntimeService();

       // 任务服务

       TaskService taskService = engine.getTaskService();

       Deployment dep = rs.createDeployment().addClasspathResource("foreach-test1.bpmn").deploy();

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

      

      

       // 启动流程

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

       /*

        * 执行Service Task 5--即执行 Foreach1Delegate execute5

        * 输出结果:

        *  测试最简单的循环执行

           测试最简单的循环执行

           测试最简单的循环执行

           测试最简单的循环执行

           测试最简单的循环执行

 

        * */

     }

 

   二、参照下图  测试后台设置循环数据

2.1 新建 foreach-test2.bpmn

     

         新建 Foreach2Delegate.java

2.2 修改  foreach-test2.bpmn

 

2.3 测试方法

/**

     *  lqx

     *  测试后台设置循环数据--遍历 datas1value 并将遍历出来的数据放入执行流变量名为data

     *  <serviceTask id="servicetask1" name="Service Task"  activiti:class="com.xiangshuai.act.c24.Foreach2Delegate">

          <multiInstanceLoopCharacteristics

               isSequential="false"  activiti:elementVariable="data">

               <loopDataInputRef>datas1</loopDataInputRef>

          </multiInstanceLoopCharacteristics>

    </serviceTask>

     */

    public static void testForeachTest2(){

       ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();

       // 存储服务

       RepositoryService rs = engine.getRepositoryService();

       // 运行时服务

       RuntimeService runService = engine.getRuntimeService();

       // 任务服务

       TaskService taskService = engine.getTaskService();

       Deployment dep = rs.createDeployment().addClasspathResource("foreach-test2.bpmn").deploy();

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

      

      

       // 启动流程

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

       ArrayList<Object> list = new ArrayList<>();

       list.add("aaaaa");

       list.add("bbbbb");

       list.add("CCCC");

       list.add("bbbDDDbb");

       list.add("EEEE");

       map.put("datas1", list);

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

       /*

        * 遍历 datas1 执行Service Task --即执行 Foreach2Delegate execute

        * 输出结果:

        *  测试后台设置循环数据--foreach-test2.bpmn--遍历datas1data:aaaaa

           测试后台设置循环数据--foreach-test2.bpmn--遍历datas1data:bbbbb

           测试后台设置循环数据--foreach-test2.bpmn--遍历datas1data:CCCC

           测试后台设置循环数据--foreach-test2.bpmn--遍历datas1data:bbbDDDbb

           测试后台设置循环数据--foreach-test2.bpmn--遍历datas1data:EEEE

 

        * */

    }

 

三、测试跳出循环

 

   3.1 新建 foreach-test3.bpmn

 

 3.2 修改 foreach-test3.bpmn

 

 

3.3 测试方法

/**

     *  lqx

     *  测试后台设置循环数据,两次后跳出循环--遍历 datas1value 并将遍历出来的数据放入执行流变量名为data

     * <serviceTask id="servicetask1" name="Service Task"  activiti:class="com.xiangshuai.act.c24.Foreach3Delegate">

          <multiInstanceLoopCharacteristics

               isSequential="false"  activiti:elementVariable="data">

               <loopDataInputRef>datas1</loopDataInputRef>

               <completionCondition>${nrOfCompletedInstances >= 2}</completionCondition>

          </multiInstanceLoopCharacteristics>

       </serviceTask>

       nrOfCompletedInstances--循环参数,已完成的实例数,详见循环参数

     */

    public static void testForeachTest3(){

       ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();

       // 存储服务

       RepositoryService rs = engine.getRepositoryService();

       // 运行时服务

       RuntimeService runService = engine.getRuntimeService();

       // 任务服务

       TaskService taskService = engine.getTaskService();

       Deployment dep = rs.createDeployment().addClasspathResource("foreach-test3.bpmn").deploy();

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

      

      

       // 启动流程

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

       ArrayList<Object> list = new ArrayList<>();

       list.add("aaaaa");

       list.add("bbbbb");

       list.add("CCCC");

       list.add("bbbDDDbb");

       list.add("EEEE");

       map.put("datas1", list);

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

       /*

        * 遍历 datas1 执行Service Task --即执行 Foreach2Delegate execute

        * 输出结果:

        *  测试后台设置循环数据,两次后跳出循环--foreach-test2.bpmn--遍历datas1data:aaaaa

                      测试后台设置循环数据,两次后跳出循环--foreach-test2.bpmn--遍历datas1data:bbbbb

           可以看到Service Task 执行两次后不再执行

        * */

    }

 

总执行类 ForeachTest.java

package com.xiangshuai.act.c24;

 

import java.util.ArrayList;

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;

 

/**

 * @author lqx

 *文件在 E:\学习文档子目录压缩\框架\工作流引擎\Activiti6.0\window\复习步骤21-  25 BPMN其他元素(3)流程活动的特性

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

 */

public class ForeachTest {

         public static void main(String[] args) {

                  //testForeachTest1();

                  //testForeachTest2();

                  testForeachTest3();

         }

        

     /**

     * 测试最简单的循环执行这个Service  Task节点

     *  <serviceTask id="servicetask1" name="Service Task">

          <multiInstanceLoopCharacteristics

               isSequential="false" >

               <loopCardinality>5</loopCardinality>

          </multiInstanceLoopCharacteristics>

    </serviceTask>

     */

    public static void testForeachTest1(){

             ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();

             // 存储服务

             RepositoryService rs = engine.getRepositoryService();

             // 运行时服务

             RuntimeService runService = engine.getRuntimeService();

             // 任务服务

             TaskService taskService = engine.getTaskService();

             Deployment dep = rs.createDeployment().addClasspathResource("foreach-test1.bpmn").deploy();

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

            

            

             // 启动流程

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

             /*

              * 执行Service Task 5次--即执行 Foreach1Delegate 的execute5次

              * 输出结果:

              *  测试最简单的循环执行

                          测试最简单的循环执行

                          测试最简单的循环执行

                          测试最简单的循环执行

                          测试最简单的循环执行

 

              * */

     }

   

   

    /**

     *  lqx

     *  测试后台设置循环数据--遍历 datas1的value值 并将遍历出来的数据放入执行流变量名为data中

     *  <serviceTask id="servicetask1" name="Service Task"  activiti:class="com.xiangshuai.act.c24.Foreach2Delegate">

          <multiInstanceLoopCharacteristics

               isSequential="false"  activiti:elementVariable="data">

               <loopDataInputRef>datas1</loopDataInputRef>

          </multiInstanceLoopCharacteristics>

    </serviceTask>

     */

    public static void testForeachTest2(){

             ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();

             // 存储服务

             RepositoryService rs = engine.getRepositoryService();

             // 运行时服务

             RuntimeService runService = engine.getRuntimeService();

             // 任务服务

             TaskService taskService = engine.getTaskService();

             Deployment dep = rs.createDeployment().addClasspathResource("foreach-test2.bpmn").deploy();

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

            

            

             // 启动流程

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

             ArrayList<Object> list = new ArrayList<>();

             list.add("aaaaa");

             list.add("bbbbb");

             list.add("CCCC");

             list.add("bbbDDDbb");

             list.add("EEEE");

             map.put("datas1", list);

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

             /*

              * 遍历 datas1 执行Service Task --即执行 Foreach2Delegate 的execute

              * 输出结果:

              *  测试后台设置循环数据--foreach-test2.bpmn--遍历datas1,data:aaaaa

                          测试后台设置循环数据--foreach-test2.bpmn--遍历datas1,data:bbbbb

                          测试后台设置循环数据--foreach-test2.bpmn--遍历datas1,data:CCCC

                          测试后台设置循环数据--foreach-test2.bpmn--遍历datas1,data:bbbDDDbb

                          测试后台设置循环数据--foreach-test2.bpmn--遍历datas1,data:EEEE

 

              * */

    }

    /**

     *  lqx

     *  测试后台设置循环数据,两次后跳出循环--遍历 datas1的value值 并将遍历出来的数据放入执行流变量名为data中

     * <serviceTask id="servicetask1" name="Service Task"  activiti:class="com.xiangshuai.act.c24.Foreach3Delegate">

          <multiInstanceLoopCharacteristics

               isSequential="false"  activiti:elementVariable="data">

               <loopDataInputRef>datas1</loopDataInputRef>

               <completionCondition>${nrOfCompletedInstances >= 2}</completionCondition>

          </multiInstanceLoopCharacteristics>

       </serviceTask>

       nrOfCompletedInstances--循环参数,已完成的实例数,详见循环参数

     */

    public static void testForeachTest3(){

             ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();

             // 存储服务

             RepositoryService rs = engine.getRepositoryService();

             // 运行时服务

             RuntimeService runService = engine.getRuntimeService();

             // 任务服务

             TaskService taskService = engine.getTaskService();

             Deployment dep = rs.createDeployment().addClasspathResource("foreach-test3.bpmn").deploy();

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

            

            

             // 启动流程

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

             ArrayList<Object> list = new ArrayList<>();

             list.add("aaaaa");

             list.add("bbbbb");

             list.add("CCCC");

             list.add("bbbDDDbb");

             list.add("EEEE");

             map.put("datas1", list);

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

             /*

              * 遍历 datas1 执行Service Task --即执行 Foreach2Delegate 的execute

              * 输出结果:

              *  测试后台设置循环数据,两次后跳出循环--foreach-test2.bpmn--遍历datas1,data:aaaaa

                      测试后台设置循环数据,两次后跳出循环--foreach-test2.bpmn--遍历datas1,data:bbbbb

           可以看到Service Task 执行两次后不再执行

              * */

    }

}

 

 

 

     

猜你喜欢

转载自blog.csdn.net/xiangshuai198807/article/details/90033754
25