Stap 4: Start de workflow die parallel uitgevoerd moet worden

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.