Todos los que hemos utilizado la herramienta, Informatica
PowerCenter, nos hemos encontrado con la problemática de realizar procesos
iterativos basados en datos.
La solución que se suele implementar es utilizar dos
WorkFlows, lo que obliga a realizar algunos cambios en los dos WorkFlows en
algunas ocasiones, y si existe una dependencia de otro WorkFlow, relacionada
con la finalización del bucle, la cosa se complica. En muchas ocasiones nos
encontramos con las limitaciones, en muchos casos infundadas, de los clientes
que no permiten la utilización de ficheros de control, para los EventWait.
Aquí intentaremos dar soluciones alternativas, que permiten
realizar seguimiento y poder controlar las ejecuciones desde el WorkFlow
Monitor.
Origen
Se quieren eliminar los controles de finalización (EventWait)
basados en ficheros. A partir de ahí hay que analizar un procedimiento que nos
permita controlar la ejecución, y finalización correcta, de los bucles y, al
mismo tiempo nos, nos facilite la posibilidad de indicar una finalización
correcta o incorrecta, al Workflow General, para que continúe, aún que no haya
finalizado un bucle o no se haya ejecutado, o forzar una parada controlada.
Problemática
La utilización de EventWait se basa en dos posibilidades:
a) Fichero de sistema
b) Event Raise
El primer caso es el que queremos utilizar, aunque si se
fuerza el borrado del fichero al comienzo y se sincronizan correctamente las
ejecuciones, en el Workflow General, debería ser igual de fiable.
El segundo caso es el que hemos analizado, para evaluar las
alternativas que nos ofrece la herramienta, intentando minimizar la
complejidad, maximizando el control y revisando opciones de reducir el
desarrollo y la gestión.
Todas las alternativas han de permitir las opciones de
controlar la finalización de cada bucle de forma independiente, ejecución
asíncrona, o analizar la finalización de todos ellos como bloque, finalización
síncrona.
Análisis de soluciones
Tras analizar las posibilidades, de la herramienta,
desechamos algunas de las alternativas, al no ser factibles.
1) Ejecutar un EventRaise, desde fuera del
Workflow, para activar el EventWait.
a) Definir el Evento en el WorkFlow o WorkLet
b) Definir un EventWait que espere ese evento
c) Definir un EventRaise desconectado, que active
el evento
d) Definir un command, en otro WorkFlow que ejecute
ese EventRaise
pmcmd
starttask -sv %INFA_DEFAULT_IS% -u <Usuario> -p <Contraseña> -usd <Directorio
de Usuarios>-f <Carpeta> -w wf_MGM_Prueba_WF_Control -wait er_FinalBucle
e) Resultado: Al ejecutar el command nos devuelve
un código de retorno que corresponde a que no se ha podido ejecutar la tarea,
al estar en ejecución el WorkFlow.
2) Ir finalizando las tareas en el WorkFlow General
a) Realizar las tareas a y b de la opción 1, para
preparar el entorno
b) Definir un command, en otro WorkFlow, que
finalice el Event Wait
i. Abort
pmcmd
aborttask -sv %INFA_DEFAULT_IS% -u <Usuario> -p <Contraseña> -usd <Directorio
de Usuarios>-f <Carpeta> -w wf_MGM_Prueba_WF_Control ew_FinalBucle
ii. Stop
pmcmd
stoptask -sv %INFA_DEFAULT_IS% -u <Usuario> -p <Contraseña> -usd <Directorio
de Usuarios>-f <Carpeta> -w wf_MGM_Prueba_WF_Control ew_FinalBucle
c) Resultado: Al ir finalizando los EventWait el
estado del WorkFlow cambia y el Workflow no continúa con la siguiente tarea.
i. Si todas las tareas acaban como stopped el
WorkFlow acaba como stopped
ii. Si alguna de las tareas, o todas, finalizan como
aborted, independientemente de si el resto finalizan como stopped, el WorkFlow
finaliza como aborted.
Soluciones Propuestas
Existen varias alternativas basadas en el concepto de
controlar las ejecuciones en base a un Workflow de Control. En ese Workflow de
control podemos tener tantas tareas como bucles, o procesos independientes, que
queramos relacionar.
En caso de generar tareas, independientes para cada proceso,
tendremos la opción de finalizarlas manualmente, como Stopped o Aborted, e
indicar al WorkFlow General si debe parar o continuar, dependiendo de la
definición de controla aplicada.
Esta solución nos permite esperar la finalización de todas
las tareas y preguntar por el estado final del WorkFlow o preguntar
independientemente por cada tarea, y continuar el flujo según esté definido,
aunque exista un único WorkFlow de Control.
La solución tiene una aplicación sencilla, y como hemos
visto, con varias alternativas de uso y control. A continuación se explicarán
la sencilla y la más completa, aunque existen variedades de las mismas.
Vamos a trabajar con:
1) Un WorkFlow, de Inicio de Bucle, que emula la
ejecución de 3 bucles y su finalización asíncrona, como stopped, con un minuto
de diferencia por cada uno de ellos.
pmcmd stoptask -sv %INFA_DEFAULT_IS% -u
<Usuario> -p <Contraseña> -usd <Directorio de Usuarios>-f <Carpeta>
-w wf_MGM_Prueba_WF_Control ew_FinalBucle
pmcmd stoptask -sv %INFA_DEFAULT_IS% -u
<Usuario> -p <Contraseña> -usd <Directorio de Usuarios>-f <Carpeta>
-w wf_MGM_Prueba_WF_Control ew_FinalBucle1
pmcmd stoptask -sv %INFA_DEFAULT_IS% -u
<Usuario> -p <Contraseña> -usd <Directorio de Usuarios>-f <Carpeta>
-w wf_MGM_Prueba_WF_Control ew_FinalBucle2
En caso de necesidad se podría forzar una
finalización con Abort, ejecutando el pmcmd aborttask, utilizando los mismo
parámetros.
2) Un
WonkFlow, de Control, con 3 eventos separados, uno por cada bucle, el
EventRaise no tiene utilidad como hemos visto en el análisis de soluciones.
Con estos WorkFlows como base, vamos a emular los procesos
indicados (General y Detallado) para explicar algunas de las posibilidades.
1) Solución General basada en el control de un
único WorkFlow
a) Creamos un WorFlow General
Todos los command tienen activado el control de errores.
i. La ejecución del WorkFlow InicioBucle
pmcmd
startworkflow -sv %INFA_DEFAULT_IS% -u <Usuario> -p <Contraseña>
-usd <Directorio de Usuarios>-f <Carpeta> -nowait
wf_MGM_Prueba_WF_InicioBucle
ii. La ejecución del WorkFlow de Control, con
parámetro –nowait y controlando la finalización errónea, ya que el pmcmd,
siempre finalizaría erroneo al cancelar las sesiones si lo ejecutamos con la
opción -wait, y de esta forma fallará únicamente en caso de no poder ejecutarlo,
al no haber finalizado una ejecución previa o tener algún problema de conexión
o configuración.
pmcmd
startworkflow -sv %INFA_DEFAULT_IS% -u <Usuario> -p <Contraseña>
-usd <Directorio de Usuarios>-f <Carpeta> -nowait
wf_MGM_Prueba_WF_Control
iii. La verificación del estado de la última
ejecución del WorkFlow de Control. Se ejecuta un primer comando WaitWorkFlow,
forzando una finalización correcta al asignarle un exit 0, y un segundo para
verificar el estado de finalización, que finalizará correctamente si el
WorkFlow de control finalizó como stopped. Se puede incluir en el command
anterior, se ha hecho así para facilitar la comprensión de los pasos.
pmcmd
waitworkflow -sv %INFA_DEFAULT_IS% -u <Usuario> -p <Contraseña>
-usd <Directorio de Usuarios>-f <Carpeta> wf_MGM_Prueba_WF_Control | exit 0
pmcmd
getworkflowdetails -sv %INFA_DEFAULT_IS% -u <Usuario> -p
<Contraseña> -usd <Directorio de Usuarios>-f <Carpeta>
wf_MGM_Prueba_WF_Control | findstr /C:"Workflow run status:
[Stopped]" > nul 2>&1 && (exit 0) || (exit 99)
iv. Para que sirva de ejemplo, se ha incluido la
ejecución, del propio WorkFlow General, en caso de finalización correcta, de
los bucles.
start cmd /C "ping -n 3
localhost && pmcmd startworkflow -sv %INFA_DEFAULT_IS% -u
<Usuario> -p <Contraseña> -usd <Directorio de Usuarios>-f <Carpeta>
-nowait wf_MGM_Prueba_WF_GeneralDeCarga"
2) Solución Detallada basada en el control
independiente de cada Bucle
a) Creamos un WorFlow Detallado
Todos los command tienen activado el control de errores.
i. La ejecución del WorkFlow InicioBucle
pmcmd
startworkflow -sv %INFA_DEFAULT_IS% -u <Usuario> -p <Contraseña>
-usd <Directorio de Usuarios>-f <Carpeta> -nowait
wf_MGM_Prueba_WF_InicioBucle
ii. La ejecución del WorkFlow de Control, con
parámetro –nowait y controlando la finalización errónea, ya que el pmcmd,
siempre finalizaría erroneo al cancelar las sesiones si lo ejecutamos con la
opción -wait, y de esta forma fallará únicamente en caso de no poder
ejecutarlo, al no haber finalizado una ejecución previa o tener algún problema
de conexión o configuración.
pmcmd
startworkflow -sv %INFA_DEFAULT_IS% -u <Usuario> -p <Contraseña>
-usd <Directorio de Usuarios>-f <Carpeta> -nowait
wf_MGM_Prueba_WF_Control
iii. La verificación del estado de la última
ejecución de cada uno de los bucles. Para cada uno de los command, se ejecuta
un primer comando WaitTask, forzando una finalización correcta al asignarle un
exit 0, y un segundo para verificar el estado de finalización, que finalizará
correctamente si la Task del WorkFlow de control finalizó como stopped. En este
caso, no tiene sentido incluir estas verificaciones en el command anterior, ya
que sería lo mismo que controlar que todo el Workflow de Control finalizara
como stopped
pmcmd
waittask -sv %INFA_DEFAULT_IS% -u <Usuario> -p <Contraseña> -usd <Directorio
de Usuarios>-f <Carpeta> -w wf_MGM_Prueba_WF_Control ew_FinalBucle | exit 0
pmcmd
gettaskdetails -sv %INFA_DEFAULT_IS% -u <Usuario> -p <Contraseña>
-usd <Directorio de Usuarios>-f <Carpeta> -w
wf_MGM_Prueba_WF_Control ew_FinalBucle | findstr /C:"Task run status:
[Stopped]" > nul 2>&1 && (exit 0) || (exit 99)
iv. Para finalizar, el WorkFlow, se ha incluido un
Decision, para que aglutine todas las tareas, igual que si hubiéramos
preguntado por la finalización del WorfFlow. Y finalmente un Command con Exit
0. Para que se pueda verificar que únicamente se ejecuta si todos los Bucles
acaban correctamente.
Ejemplo de Ejecución: