如何将不同的数据值传递给Alfresco activiti多实例子进程

时间:2017-06-13 05:30:01

标签: subprocess alfresco activiti

我创建了一个多实例子流程,并且使用多实例的loopCardinality元素动态创建了子进程数,但我的问题是我无法将不同的数据值传递给每个子进程。

图片在这里: process image

这是我的问题场景,如上图所示。我想基于loopCardinality值划分子流程,如:

int getSubProcessDataValue(int fileCount,int  loopCardinality){
    if(fileCount < 1 && loopCardinality < 1)
      return 0
    int result=fileCount/loopCardinality;
    return result;
}

假设fileCount = 7且loopCardinality = 2,则上述函数将为第一个子进程返回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,则上述函数将为最后一个子进程返回4。这意味着我必须将4个文件名传递给最后一个子进程。

任何人都知道如何实施它?请帮帮我。

2 个答案:

答案 0 :(得分:0)

在我看来,这实际上是Activiti引擎最酷的功能之一。 您可以使用收集选项而不是设置基数来执行此操作。 collection和elementValue选项如下所示:

     

这里的实例数量将由集合的大小和输入变量&#34; elementValue&#34;将是列表元素。

使用此方法,您可以将不同的数据传递到多实例循环的每个实例中。

希望这有帮助, 格雷格

答案 1 :(得分:0)

我使用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>

非常感谢您的宝贵支持!!!