De workflow die parallel gedraaid moet worden wordt via een command task gestart.
Het volgende commando wordt uitgevoerd:
$INFA_SCRIPTS/startconcurrentworkflow.sh $PMIntegrationServiceName $PMFolderName $$WORKFLOW $$NRCONCUR $$DELAY
Het commando maakt gebruik van de volgende workflowvariabelen:
$PMIntegrationServiceName | Dit is een automatische variabele. De variabele is gevuld met de integratie service van de hoofdworkflow. De parallelle workflow draait dus op dezelfde integratie service als de hoofdworkflow. |
$PMFolderName | Dit is een automatische variabele. De variabele is gevuld met de map waarin de hoofdworkflow staat. De parallelle workflow moet dus in dezelfde map staan als de hoofdworkflow. |
$$WORKFLOW | De naam van de workflow die parallel gestart moet worden. Deze moet gezet zijn in de workflow variabelen. |
$$NRCONCUR | Het aantal parallelle processen. Deze is in stap 2 gevuld vanuit de CT_DEF_BATCH_CONTROL tabel. |
$$DELAY | Het aantal seconden wachttijd voordat de volgende workflow gestart wordt. Deze is in stap 2 gevuld vanuit de CT_DEF_BATCH_CONTROL tabel. |
Het startconcurrentworkflow.sh script staat in de $INFA_SCRIPTS map op de Powercenter server. $INFA_SCRIPTS is een omgevingsvariabele op de Powercenter server. Het script heeft de volgende inhoud:
#!/bin/ksh
# This script starts the same workflow multiple times
# Date: 12-3-2010
# Writer: R.A. ten Hoope
# -----------------------------------------------------------------
# Getting the parameters
# -----------------------------------------------------------------
INT_SVC=$1
FOLDER=$2
WORKFLOW=$3
WFCOUNT=$4
WAITTIME=$5
WFNR=1
echo Start `date` > $INFA_SHARED/log/startconcurrentworkflow.log
while (($WFNR <= $WFCOUNT)); do
if [[ $WFNR > 1 ]]; then
sleep $WAITTIME
fi
$PMCMD startworkflow -sv $INT_SVC -u PM_WF_Operator -p PM_WF_Operator -f $FOLDER -wait -rin 'INST_'$WFNR $WORKFLOW >> $INFA_SHARED/log/startconcurrentworkflow.log &
(( WFNR+=1 ))
done
# -----------------------------------------------------------------
# Wacht tot alle processen zijn beindigd
# -----------------------------------------------------------------
while (( `jobs -p | wc -l` > 0 )); do
sleep 5
done
# -----------------------------------------------------------------
# Controleer het resultaat van de workflows.
# -----------------------------------------------------------------
WFNR=1
ERROR=0
while (($WFNR <= $WFCOUNT)); do
SUCCEEDCOUNT=`$PMCMD getworkflowdetails -sv $INT_SVC -u PM_WF_Operator -p PM_WF_Operator -f $FOLDER -rin 'INST_'$WFNR $WORKFLOW | grep 'Workflow run status\: \[Succeeded\]' | wc -l`
if [[ $SUCCEEDCOUNT = 0 ]]; then
ERROR=1
fi
echo 'Controle inst_$WFNR resultsst $SUCCEEDCOUNT' >> $INFA_SHARED/log/startconcurrentworkflow.log
(( WFNR+=1 ))
done
exit $ERROR
Het script geeft een 0 terug als alle parallelle processen zonder fouten gedraaid hebben en een 1 als er één of meerdere fout gegaan zijn.
Zorg er voor dat de te starten workflow geconfigureerd is voor Concurrent Execution. Alleen dan kan de workflow parallel draaien:
De workflow die gestart wordt, start zelf weer een mapping die het eigenlijke werk doet. Om er voor te zorgen dat de mapping de juiste data selecteert, moet een User defined join en een Source Filter opgenomen worden.
User Defined Join:
BRONTABEL.BATCHID = CT_DEF_BATCH_CONTROL.BATCHID + tonumber(substr('$PMWorkflowRunInstanceName', instr('$PMWorkflowRunInstanceName', '', -1)+1))-1
Source filter:
CT_DEF_BATCH_CONTROL.MAPPING_NAME = 'm_Mapping_Naam'
De expressie in de user defined join zoekt de laatste underscore in de $PMWorkflowRunInstanceName en maakt een nummer van de cijfers achter de underscore. Dit samen met het getal in CT_DEF_BATCH_CONTROL.BATCHID bepaalt het te selecteren BATCHID in de brontabel.
De source filter zorgt er voor dat het juiste record in CT_DEF_BATCH_CONTROL geselecteerd wordt.