如何将不同的数据值传递给 Alfresco activiti 多实例子流程
How to pass different data value to Alfresco activiti multi instance subprocess
我创建了一个多实例子进程,子进程的数量是使用多实例的 loopCardinality
元素动态创建的,但我的问题是我无法将不同的数据值传递给每个子进程。
图片在这里:
这是我的问题场景,如上图所示。我想根据 loopCardinality
值划分子流程,例如:
int getSubProcessDataValue(int fileCount,int loopCardinality){
if(fileCount < 1 && loopCardinality < 1)
return 0
int result=fileCount/loopCardinality;
return result;
}
假设 fileCount=7 和 loopCardinality=2 那么上面的函数将为第一个子进程 return 3。这意味着我必须将 3 个文件名传递给第一个子进程。
int getLastSubProcessDataValue(int fileCount,int loopCardinality){
if(fileCount < 1 && loopCardinality < 1)
return 0
int result=fileCount/loopCardinality;
int rem=fileCount%loopCardinality;
return result+rem;
}
假设 fileCount=7 和 loopCardinality=2 那么上面的函数将为最后一个子进程 return 4。这意味着我必须将 4 个文件名传递给最后一个子进程。
有人知道如何实施吗?请帮助我。
在我看来,这实际上是 Activiti 引擎最酷的功能之一。
您可以通过使用集合选项而不是设置基数来执行此操作。
collection 和 elementValue 选项如下图:
此处的实例数将由集合的大小决定,输入变量"elementValue"将是列表元素。
使用这种方法,您可以将不同的数据传递到多实例循环的每个实例中。
希望这对您有所帮助,
格雷格
我已经使用 TaskListener 完成了,如下代码所示:
package com.knovel.workflow.scripts;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;
public class FileSplittingTaskListener implements TaskListener{
private static final long serialVersionUID = 3972525330472103945L;
@Override
public void notify(DelegateTask task) {
System.out.println("#####FileSplittingTaskListener######");
task.setVariable("bpm_assignee", task.getVariable("bpm_assignee"));
task.setVariable("bpm_comment", task.getVariable("bpm_comment"));
task.setVariable("bpm_dueDate", task.getDueDate());
task.setVariable("bpm_priority", task.getPriority());
String strFileSplitter=(String)task.getVariable("wf_fileSplitter");
System.out.println("#############FileSplitter >>"+strFileSplitter);
Integer fileSplitter=Integer.parseInt(strFileSplitter);
System.out.println("#############FileSplitter >>"+fileSplitter);
//task.setVariable("wf_taskCounter", fileSplitter);
String workFlowFileName=(String)
task.getVariable("wf_workFlowFileName");
String[] files=workFlowFileName.split("-");
System.out.println("#######Files Length:"+files.length);
List<String[]> filesList = splitArray(files, fileSplitter);
List<String> fileList=new ArrayList<>();
for (String[] lists : filesList) {
String fileName="";
int srNo=0;
int count=1;
for (String string : lists) {
System.out.println("File>>"+string);
if(count == lists.length){
fileName=fileName+ ++srNo +"-"+string;
}else{
fileName=fileName+ ++srNo +"-"+string+",";
}
count++;
}
fileList.add(fileName);
srNo=0;
}
System.out.println("FileList>>"+fileList);
System.out.println("#############FileList >>"+fileList);
task.setVariable("filesList", fileList);
}
public static <T extends Object> List<T[]> splitArray(T[] array, int
max){
int x = array.length / max;
int r = (array.length % max); // remainder
int lower = 0;
int upper = 0;
List<T[]> list = new ArrayList<T[]>();
int i=0;
for(i=0; i<x; i++){
upper += max;
list.add(Arrays.copyOfRange(array, lower, upper));
lower = upper;
}
if(r > 0){
list.add(Arrays.copyOfRange(array, lower, (lower + r)));
}
return list;
}
}
并且我更新了 multiInstanceLoopCharacteristics 元素属性,如下所示:
<multiInstanceLoopCharacteristics
isSequential="false"
activiti:collection="filesList"
activiti:elementVariable="wf_workFlowFileName">
</multiInstanceLoopCharacteristics>
非常感谢您的宝贵支持!!!
我创建了一个多实例子进程,子进程的数量是使用多实例的 loopCardinality
元素动态创建的,但我的问题是我无法将不同的数据值传递给每个子进程。
图片在这里:
这是我的问题场景,如上图所示。我想根据 loopCardinality
值划分子流程,例如:
int getSubProcessDataValue(int fileCount,int loopCardinality){
if(fileCount < 1 && loopCardinality < 1)
return 0
int result=fileCount/loopCardinality;
return result;
}
假设 fileCount=7 和 loopCardinality=2 那么上面的函数将为第一个子进程 return 3。这意味着我必须将 3 个文件名传递给第一个子进程。
int getLastSubProcessDataValue(int fileCount,int loopCardinality){
if(fileCount < 1 && loopCardinality < 1)
return 0
int result=fileCount/loopCardinality;
int rem=fileCount%loopCardinality;
return result+rem;
}
假设 fileCount=7 和 loopCardinality=2 那么上面的函数将为最后一个子进程 return 4。这意味着我必须将 4 个文件名传递给最后一个子进程。
有人知道如何实施吗?请帮助我。
在我看来,这实际上是 Activiti 引擎最酷的功能之一。 您可以通过使用集合选项而不是设置基数来执行此操作。 collection 和 elementValue 选项如下图:
此处的实例数将由集合的大小决定,输入变量"elementValue"将是列表元素。
使用这种方法,您可以将不同的数据传递到多实例循环的每个实例中。
希望这对您有所帮助, 格雷格
我已经使用 TaskListener 完成了,如下代码所示:
package com.knovel.workflow.scripts;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;
public class FileSplittingTaskListener implements TaskListener{
private static final long serialVersionUID = 3972525330472103945L;
@Override
public void notify(DelegateTask task) {
System.out.println("#####FileSplittingTaskListener######");
task.setVariable("bpm_assignee", task.getVariable("bpm_assignee"));
task.setVariable("bpm_comment", task.getVariable("bpm_comment"));
task.setVariable("bpm_dueDate", task.getDueDate());
task.setVariable("bpm_priority", task.getPriority());
String strFileSplitter=(String)task.getVariable("wf_fileSplitter");
System.out.println("#############FileSplitter >>"+strFileSplitter);
Integer fileSplitter=Integer.parseInt(strFileSplitter);
System.out.println("#############FileSplitter >>"+fileSplitter);
//task.setVariable("wf_taskCounter", fileSplitter);
String workFlowFileName=(String)
task.getVariable("wf_workFlowFileName");
String[] files=workFlowFileName.split("-");
System.out.println("#######Files Length:"+files.length);
List<String[]> filesList = splitArray(files, fileSplitter);
List<String> fileList=new ArrayList<>();
for (String[] lists : filesList) {
String fileName="";
int srNo=0;
int count=1;
for (String string : lists) {
System.out.println("File>>"+string);
if(count == lists.length){
fileName=fileName+ ++srNo +"-"+string;
}else{
fileName=fileName+ ++srNo +"-"+string+",";
}
count++;
}
fileList.add(fileName);
srNo=0;
}
System.out.println("FileList>>"+fileList);
System.out.println("#############FileList >>"+fileList);
task.setVariable("filesList", fileList);
}
public static <T extends Object> List<T[]> splitArray(T[] array, int
max){
int x = array.length / max;
int r = (array.length % max); // remainder
int lower = 0;
int upper = 0;
List<T[]> list = new ArrayList<T[]>();
int i=0;
for(i=0; i<x; i++){
upper += max;
list.add(Arrays.copyOfRange(array, lower, upper));
lower = upper;
}
if(r > 0){
list.add(Arrays.copyOfRange(array, lower, (lower + r)));
}
return list;
}
}
并且我更新了 multiInstanceLoopCharacteristics 元素属性,如下所示:
<multiInstanceLoopCharacteristics
isSequential="false"
activiti:collection="filesList"
activiti:elementVariable="wf_workFlowFileName">
</multiInstanceLoopCharacteristics>
非常感谢您的宝贵支持!!!