2017-06-13 14 views
0

マルチインスタンスサブプロセスを作成し、マルチインスタンスのloopCardinality要素を使用してサブプロセスの数を動的に作成しましたが、私の問題は、データ値を各サブプロセスに割り当てる。 Please click here to open the imageAlfresco activitiマルチインスタンスサブプロセスに異なるデータ値を渡す方法

これは私の問題シナリオです。次いで、上記の関数は、最初のサブプロセスのための3が返され

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

と仮定FILECOUNT = 7とloopCardinality = 2:私は次のようloopCardinality値に基づいて、サブプロセスを分割します。つまり、最初のサブプロセスに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つのファイル名を渡す必要があります。

誰でもその実装方法を知っていますか?私を助けてください。

答えて

0

これは実際に私の意見ではActivitiエンジンの最もクールな機能の1つです。 カーディナリティを設定するのではなく、コレクションオプションを使用してこれを行います。 収集およびelementValueオプション下記のように:ここ

インスタンスの数は、コレクションのサイズによって決定され、入力変数「elementValue」はリスト要素であろう。

このアプローチを使用すると、マルチインスタンスループの各インスタンスに異なるデータを渡すことができます。このことができます

希望、 グレッグ

コードの下に示したように、私はそれがTaskListenerを使用して行っている
+0

ありがとうHarley ..私はあなたが提案したのと同じことを行い、期待どおりに働いています。 –

+0

それはあなたのために働いてうれしい。あなたは私に正しい答えをマークできますか? –

0

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> 

貴重なご支援ありがとうございました!

関連する問題