6.11.2010

Invocar un Workflow desde Otro Workflow y Detectar el Evento de Terminación de cada Workflow

Una tarea muy común cuando se usa el Workflow Foundation es invocar un workflow desde otro Workflow. Esta tarea no tiene mucha dificultad; sin embargo, en muchas ocasiones me he encontrado con la necesidad de atrapar el evento de finalización de uno de los dos workflow para llevar a cabo una acción determinada. Este post detalla lo que se debe hacer para saber cuando finalizó el workflow que estamos buscando.

En primera instancia vamos a crear un proyecto de Consola que contenga un workflow integrado secuencua – lo vamos a usar a manera de ejemplo, porque para un escenario en la vida real, deberíamos escojer una librería de workflow. Vamos a crear un workflow secuencial sencillo con un “Code Activity” al inicio del workflow y otro al final del workflow. En el medio de ambas actividades vamos a colocar la actividad de invocación del otro workflow. La siguiente figura nos muestra el workflow secuencial comentado.

image

El código de las actividades de código ( valga la redundancia :) ) se presenta a continuación:

private void InicializarWorkflow(object sender, EventArgs e)
{
Trace.WriteLine("Iniciando el Workflow 1");
}

private void WorkflowFinalizado(object sender, EventArgs e)
{
Trace.WriteLine("Workflow 1 Finalizado");
}



Lo único que harán esas actividades es poner un mensaje en la pantalla de output de Visual Studio cuando estemos ejecutando la aplicación, lo cual lo hago con el fin de que se pueda ver el orden de ejecución del workflow – es importante destacar que el trace es una clase que esta en el namespace System.Diagnostics, por lo tanto tenemos que incluir el namespace utilizando la directiva usign.



Seguidamente procedemos a crear un segundo workflow secuencial, el cual tendrá solamente un “Code Activity” el cual nos indicará que estamos ejecutando el workflow 2.



image



El código de la actividad funciona igual que las anteriores



private void IniciandoWF2(object sender, EventArgs e)
{
Trace.WriteLine("Iniciando Workflow 2");
}



Ahora procedemos a configurar la figura del workflow 1 en donde se invoca el workflow 2. Esto lo hacemos seleccionado la Actividad “invokeWorkflowActivity1” y en la propiedad TargetWorkflow le damos click al botón para que nos aparezca la pantalla para seleccionar el workflow que queremos llamar.



image









Una vez seleccionado el workflow, las propiedades de la actividad para invocar el workflow 2 deberían quedar así:



image



y el workflow 1 debería verse así:



image



El siguiente paso es determinar cuando ha finalizado el workflow 1 y cuando ha finalizado el workflow 2. Para lograrlo, primero vamos a ir al método main de la consola, y vamos a cambiar el handler para el método WorkflowCompleted perteneciente al Runtime y vamos a agregarle el método para que se vea de la siguiente forma:



using (WorkflowRuntime workflowRuntime = new WorkflowRuntime())
{
AutoResetEvent waitHandle = new AutoResetEvent(false);
workflowRuntime.WorkflowCompleted += workflowRuntime_WorkflowCompleted;
workflowRuntime.WorkflowTerminated += delegate(object sender, WorkflowTerminatedEventArgs e)
{
Console.WriteLine(e.Exception.Message);
waitHandle.Set();
};

WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(InvocarOtroWF.Workflow1));
instance.Start();

waitHandle.WaitOne();
}



Seguidamente procedemos a codificar el handler del evento WorkflowCompleted:



static void workflowRuntime_WorkflowCompleted(object sender, WorkflowCompletedEventArgs e)
{
if (e.WorkflowDefinition is Workflow1)
{
Trace.WriteLine("Workflow 1 Completado");
}
else
{
Trace.WriteLine("Workfow 2 Completado");
}
}



Como se puede ver en el código anterior, el evento workflow completed en la variable e del tipo WorkflowCompletedEventArgs tiene una propiedad llamada WorkflowDefinition, la cual me da el tipo del workflow que disparo el evento. En este caso para verificar cual workflow disparó el evento, simplemente debo de preguntar si esta propiedad es del tipo Workflow1; si es así, procedo a indicarlo con la clase Trace de lo contrario el workflow que lanzó el evento es el Workflow 2.



Si ejecutamos esta aplicación, veremos los resultados en el output Window de Visual Studio tal y como se ve en la siguiente figura:



image



Hay que notar la diferencia entre el texto de Workflow finalizado escrito por la actividad de código y el evento workflow completado del runtima, ya que este último es un evento disparado por el runtime de los workflows cuando recibe una notificación indicandole que el workflow X esta completo y no hay más actividades por ejecutar, mientras que en la actividad, es simplemente el código que pusimos en la actividad y que debe de ejecutarse cuando el flujo del workflow vaya por la misma, lo cual es diferente a que este completado.




Technorati Tags: ,,

No hay comentarios: