多实例流程活动
设置循环数据
在要循环的流程节点中加入下标签,表示循环执行
后台设置循环数据
跳出循环
如上图加标签就是执行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
* 测试后台设置循环数据--遍历 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
* */
}
三、测试跳出循环
3.1 新建 foreach-test3.bpmn
3.2 修改 foreach-test3.bpmn
3.3 测试方法
/**
* 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 执行两次后不再执行
* */
}
总执行类 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 执行两次后不再执行
* */
}
}