2017-06-13 1 views
0

Ich habe einen Multi-Instanz-Subprozess erstellt und die Anzahl der Subprozesse wird dynamisch mit dem loopCardinality-Element von Multi-Instance erstellt, aber mein Problem ist, dass ich nicht anders als anders übergeben kann Datenwert für jeden Unterprozess. Please click here to open the imageWie man verschiedene Datenwerte an Alfresco activiti multi-instance-Subprozess übergibt

Dies ist mein Problemszenario, wie im obigen Bild gezeigt. Ich mag subprocess teilen, basierend auf loopCardinality Wert wie:

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

Angenommen Filecount = 7 und loopCardinality = 2 dann die obige Funktion 3 für den ersten Teilprozess zurück. Das bedeutet, dass ich 3 Dateinamen an den ersten Teilprozess übergeben muss.

int getLastSubProcessDataValue(int fileCount,int loopCardinality){ 
    if(fileCount < 1 && loopCardinality < 1) 
     return 0 
    int result=fileCount/loopCardinality; 
    int rem=fileCount%loopCardinality; 
    return result+rem; 
} 

Angenommen Filecount = 7 und loopCardinality = 2 dann ist die obige Funktion wird 4 für den letzten Teilprozess zurückzukehren. Das bedeutet, dass ich 4 Dateinamen an den letzten Subprozess übergeben muss.

Jeder hat eine Idee, wie man es implementiert? Bitte hilf mir.

Antwort

0

Dies ist meiner Meinung nach eines der coolsten Features der Activiti-Engine. Sie tun dies, indem Sie die Sammeloption verwenden und nicht die Kardinalität festlegen. Die Sammlung und elementValue Optionen wie unten dargestellt:

Hier wird die Anzahl der Instanzen wird durch die Größe der Sammlung und die Eingangsvariablen „elementValue“ wird das Listenelement bestimmt werden.

Mit diesem Ansatz können Sie verschiedene Daten in jede Instanz der Mehrfachinstanzschleife übertragen.

hoffe, das hilft, Greg

+0

Dank Harley..Ich mache das gleiche wie Sie vorgeschlagen und es funktioniert wie erwartet. –

+0

Froh, dass es für dich funktioniert hat. Kannst du die richtige Antwort für mich markieren? –

0

Ich habe es TaskListener getan wie unten Code dargestellt:

<multiInstanceLoopCharacteristics 
    isSequential="false" 
    activiti:collection="filesList" 
    activiti:elementVariable="wf_workFlowFileName"> 
</multiInstanceLoopCharacteristics> 

:

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; 
    } 
    } 

Und ich habe multiInstanceLoopCharacteristics Elementeigenschaften aktualisiert, wie unten gezeigt Vielen Dank für Ihre wertvolle Unterstützung !!!

Verwandte Themen