Modelo de flujo de trabajo primario-secundario mediante dúplex durable
Una estrategia de diseño habitual para implementar un flujo de trabajo para un proceso complejo y de ejecución prolongada es identificar partes de la lógica empresarial que puedan aislarse en flujos de trabajo más pequeños y sencillos y que se pueden volver a usar. A continuación, coordinar su ejecución desde el flujo de trabajo principal. Por ejemplo, para el procesamiento de pedidos de compra, podría definir la lógica de ventas como un flujo de trabajo (secundario) que, a su vez, se llama desde el flujo de trabajo de pedido de compra principal cuando sea necesario.
En Windows Workflow Foundation en .NET Framework 4, no hay funciones incorporadas que permitan invocar un flujo de trabajo de ejecución prolongada desde otro. Sin embargo, existen varias opciones de implementación que permiten a los programadores configurar manualmente un comportamiento de este tipo. Tratar todas las opciones disponibles queda fuera del ámbito de este ejemplo. Este ejemplo se centra en una de las estrategias más frecuentes y genéricas para implementar el modelo “Invocar flujo de trabajo”: el dúplex durable y, específicamente, el contexto de servicios de flujo de trabajo WCF (flujos de trabajo XAMLX). El concepto subyacente al modelo dúplex durable es sencillo: el elemento principal realiza una llamada a un extremo expuesto por el elemento secundario y transmite un símbolo (token) de contexto (usado para la correlación) y una dirección de devolución de llamada junto con el mensaje solicitado. A continuación, tras un tiempo mientras finaliza el elemento secundario, realiza una devolución de llamada para que el elemento principal sepa que ha finalizado.
Para obtener más información acerca de la configuración manual del dúplex durable, consulte el artículo de MSDN Dúplex duradero (https://go.microsoft.com/fwlink/?LinkId=196632) y los ejemplos relacionados de dúplex duradero WF (https://go.microsoft.com/fwlink/?LinkId=194430) y How to: Create a Workflow Service That Calls Another Workflow Service (en inglés).
El objetivo principal de este ejemplo es proporcionar dos actividades personalizadas basadas en la interfaz IActivityTemplateFactory y diseñadas para simplificar la implementación de dúplex durable mediante la automatización del proceso de configuración. La actividad Workflow Callable Sequence se usa en el flujo de trabajo secundario y no en las actividades Receive y Send predeterminadas generadas tras la creación del flujo de trabajo. La actividad Call Workflow Sequence se usa en el flujo de trabajo principal para generar las actividades y la configuración relacionada necesaria para comunicarse con el flujo de trabajo secundario. Estas actividades se pueden volver a usar y agregarse al cuadro de herramientas de Visual Studio.
El ejemplo consta de dos soluciones:
La primera solución (CallWorkflowActivities) contiene las dos actividades mencionadas anteriormente. Para habilitar estas actividades y poder usarlas en el diseñador de flujos de trabajo de Visual Studio, es suficiente compilar la solución y agregar las actividades desde el conjunto resultante al cuadro de herramientas de Visual Studio.
La segunda solución (DurableDuplex_with_CallWorkflowActivities) es una implementación de ejemplo de flujos de trabajo principal y secundario que se comunican a través del dúplex durable configurado mediante las actividades Workflow Callable Sequence y Call Workflow Sequence.
Nota
Los ejemplos se proporcionan únicamente con fines de aprendizaje. No están concebidos para su uso en un entorno de producción ni se han probado en este tipo de entorno. Microsoft no proporciona asistencia técnica para estos ejemplos.
Requisitos previos
Esta aplicación de ejemplo está orientada a lectores que tengan la siguiente experiencia o niveles de conocimiento:
Conocimientos básicos de Internet Information Services (IIS)
Conocimientos básicos de las aplicaciones WCF y Windows Workflow Foundation (WF)
Conocimientos básicos de Windows PowerShell
Conocimientos básicos de Microsoft SQL Server
Además, es necesario que estén instaladas las características de tiempo de ejecución de los Servicios de hospedaje de Microsoft AppFabric 1.1 para Windows Server y que estén configuradas las siguientes funciones para ejecutar la solución DurableDuplex_with_CallWorkflowActivities.
Almacén de persistencia
Almacén de seguimiento
Ubicación y archivos de la aplicación de ejemplo
Solución 1: CallWorkflowActivities
Nombre del archivo | Descripción |
---|---|
CallWorkflowActivities.sln |
Archivo de solución para la solución CallWorkflowActivities |
CallWorkflowActivities |
Carpeta del proyecto |
CallWorkflowActivities.csproj |
Archivo de proyecto |
Properties\AssemblyInfo.cs |
Archivo de información del ensamblado |
Activities\WorkflowCallableSequence.cs, Activities \CallWorkflowService.cs |
Archivos de origen para las dos actividades IActivityTemplateFactory: WorkflowCallableSequence y CallWorkflowService |
UI\CallWorkflowConfiguration.xaml, UI\CallWorkflowConfiguration.xaml.cs, UI\WebConfigContent.xaml, UI\WebConfigContent.xaml.cs, UI\WorkflowCallableSequenceConfiguration.xaml, UI\WorkflowCallableSequenceConfiguration.xaml.cs |
Diseño de la UI y archivos de origen para los cuadros de diálogo que se usan en la configuración del dúplex durable |
Code\Helpers.cs |
Código fuente con clases compatibles |
Images\requiredBang.gif |
Archivo de imagen de campos obligatorios |
Solución 2: DurableDuplex_with_CallWorkflowActivities
Nombre del archivo | Descripción |
---|---|
DurableDuplex_with_CallWorkflowActivities.sln |
Archivo de solución para la solución DurableDuplex_with_CallWorkflowActivities |
SampleChildService |
Carpeta de proyecto para el servicio secundario de ejemplo |
SampleChildService.csproj |
Archivos de proyecto para el servicio secundario de ejemplo |
Properties\AssemblyInfo.cs |
Archivo de información del ensamblado |
ChildWorkflow.xamlx |
Definición del flujo de trabajo para el servicio secundario (XAMLX) |
Web.config |
Archivo de configuración web para el servicio secundario |
SampleParentService |
Carpeta de proyecto para el servicio principal de ejemplo |
SampleParentService.csproj |
Archivos de proyecto para el servicio principal de ejemplo |
Properties\AssemblyInfo.cs |
Archivo de información del ensamblado |
ParentWorkflow.xamlx |
Definición del flujo de trabajo para el servicio principal (XAMLX) |
Web.config |
Archivo de configuración web para el servicio principal |
SampleClient |
Carpeta para el cliente de la prueba |
SampleClient.csproj |
Archivo de proyecto del cliente de la prueba |
mainForm.cs, mainForm.Designer.cs, mainForm.resx, Program.cs |
Archivos de origen para el formulario principal y la aplicación |
Properties\Resources.Designer.cs, Properties\Resources.resx, Properties\Settings.Designer.cs, Properties\Settings.settings |
Archivos relacionados con recursos y configuración del proyecto |
Properties\AssemblyInfo.cs |
Archivo de información del ensamblado |
app.config |
Archivo de configuración de la aplicación para el cliente de la prueba |
Configuración de este ejemplo
Inicie Visual Studio 2010 con permisos administrativos.
Nota
Estos pasos demuestran el modo de crear e implementar las soluciones CallWorkflowActivities y DurableDuplex_with_CallWorkflowActivities con Visual Studio 2010 y de configurar un grupo de aplicaciones para su uso con estos servicios:
Abra <ejemplos>\ Samples\Integration\Call Workflow (DurableDuplex)\ CallWorkflowActivities\CallWorkflowActivities.sln, donde <ejemplos> es la ruta de acceso en la que instaló los ejemplos de AppFabric.
En el menú Generar, haga clic en Generar solución. Compruebe que el proyecto se genera sin errores en la ventana de salida.
Nota
El ensamblado con las actividades WorkflowCallableSequence y CallWorkflowService estará compilado y listo para agregarse a la barra de herramientas (vea la sección Ejecución de este ejemplo para obtener más información).
Abra <ejemplos>\ Samples\Integration\Call Workflow (DurableDuplex)\DurableDuplex_with_CallWorkflowActivities\ DurableDuplex_with_CallWorkflowActivities.sln, donde <ejemplos> es la ruta de acceso en la que instaló los ejemplos de AppFabric.
Cuando reciba las indicaciones para crear los directorios virtuales de los proyectos SampleParentService y SampleChildService, haga clic en Sí.
En el menú Generar, haga clic en Generar solución. Compruebe que los tres proyectos se generan sin errores en la ventana de salida.
Inicie el Administrador de Internet Information Services (IIS). Haga clic en Inicio, Todos los programas, Microsoft AppFabric 1.1 para Windows Server y, a continuación, en Administrador de Internet Information Services (IIS).
Expanda el nodo del servidor en la vista en árbol de la izquierda y, a continuación, haga clic en Grupos de aplicaciones.
Haga clic con el botón secundario en la lista que va a ejecutar los servicios de ejemplo (puede usar uno de los grupos existentes o crear uno nuevo) y, a continuación, seleccione Configuración avanzada.
Use el menú desplegable para establecer .NET Framework Version en v4.0 y haga clic en Aceptar.
En el panel izquierdo, expanda Sitios y, a continuación, la opción Sitio web predeterminado.
Localice la aplicación SampleChildService, haga clic con el botón secundario y seleccione Administrar aplicación. A continuación, seleccione Configuración avanzada.
Actualice la propiedad Protocolos habilitados de http a http,net.pipe. Observe que no hay ningún espacio detrás de la coma. Haga clic en Aceptar para confirmar los cambios.
En la propiedad Grupo de aplicaciones, desplácese hasta el grupo de aplicaciones configurado en el paso 9.
Localice la aplicación SampleParentService, haga clic con el botón secundario y seleccione Administrar aplicación. A continuación, seleccione Configuración avanzada.
Actualice la propiedad Protocolos habilitados de http a http,net.pipe. Observe que no hay ningún espacio detrás de la coma. Haga clic en Aceptar para confirmar los cambios.
En la propiedad Grupo de aplicaciones, desplácese hasta el grupo de aplicaciones configurado en el paso 9.
Nota
Los pasos 13 a 16 agregan el protocolo net.pipe a las aplicaciones de servicio principal y secundaria, que son necesarias para la administración de instancias de flujo de trabajo persistentes.
Ejecución de este ejemplo: Opción 1
Inicie Visual Studio 2010 con permisos administrativos.
Importante Existen dos opciones para ejecutar este ejemplo. En este tema se proporcionan pasos para ambas. La Opción 1 presenta toda la experiencia del uso de las actividades WorkflowCallableSequence y CallWorkflowService para invocar un flujo de trabajo secundario desde uno principal, mientras que la opción 2 solamente considera la solución final: una implementación de dúplex durable listo para su ejecución que omite por completo la experiencia de diseño. Para obtener más información, vea la sección de demostración a continuación. Nota
La solución CallWorkflowActivities está diseñada para mejorar la experiencia de tiempo de diseño de la implementación de un dúplex durable. Como tal, no hay nada que “ejecutar”. No obstante, estos pasos proporcionan un tutorial sobre el uso de las actividades en una solución sencilla donde un flujo de trabajo principal llama a uno secundario.
Cree un nuevo proyecto del tipo Aplicación de Servicio de flujo de trabajo de WCF (esta plantilla de proyecto se encuentra debajo de los tipos de proyecto de flujo de trabajo) y asigne al nuevo proyecto el nombre ChildService.
Adición de las actividades personalizadas de ejemplo al cuadro de herramientas: cuando se abra el diseñador de WF, haga clic con el botón secundario en el cuadro de herramientas del grupo de actividades Mensajería.
Seleccione Elegir elementos y haga clic en la pestaña Componentes de System.Activities.
Haga clic en Examinar y desplácese hasta <ejemplos>\ Samples\Integration\Call Workflow (DurableDuplex)\ CallWorkflowActivities\ CallWorkflowActivities\bin\Debug. A continuación, seleccione el ensamblado CallWorkflowActivities.dll y haga clic en Abrir (se trata del ensamblado compilado en el paso 3 de la sección “Configuración de este ejemplo” de este documento). Observe las dos nuevas entradas en la parte superior de la lista Componentes de System.Activities.
Haga clic en Aceptar para agregar las actividades CallWorkflowService y WorkflowCallableSequence al cuadro de herramientas. El cuadro de herramientas debe tener un aspecto similar al de la siguiente captura de pantalla.
Implementación del flujo de trabajo de ChildService: En el Explorador de soluciones, cambie el nombre de Service1.xamlx a ChildService.xamlx.
En el área principal del diseñador para ChildService, seleccione la actividad Sequential Service y presione Eliminar.
Arrastre la actividad WorkflowCallableSequence desde el cuadro de herramientas hasta la superficie del diseñador de WF. De este modo se abre el cuadro de diálogo de configuración, que le guía en la tarea de configurar ChildService como participante del dúplex durable.
Configuración de WorkflowCallableSequence: complete las propiedades tal como se muestran en la siguiente captura de pantalla y haga clic en Aceptar.
Actualización del archivo web.config: el funcionamiento de una implementación de dúplex durable depende en gran medida de que las entradas de web.config sean las correctas. La pantalla Actualizaciones de Web.config genera automáticamente las entradas necesarias para el archivo web.config del flujo de trabajo secundario.
Nota
El propio archivo web.config no se actualiza automáticamente. En el paso siguiente, copiará/pegará las entradas necesarias en el archivo web.config.
Haga clic en Copiar al Portapapeles & Cerrar. De este modo se copian al Portapapeles las entradas necesarias resaltadas, de modo que estén listas para pegarse en el archivo web.config. Haga clic en Aceptar en el cuadro de mensaje.
Abra el archivo web.config para el proyecto ChildService y pegue el contenido del Portapapeles (del paso 12) justo después de la etiqueta <system.serviceModel>:
... <system.serviceModel> <services> <service name="ChildService"> <endpoint address="" binding="wsHttpContextBinding" contract="ICallChildService" name="ChildServiceICallChildServiceStartWorkflow" /> </service> </services> <client> <endpoint binding="wsHttpContextBinding" contract="ICallChildService" name="ChildServiceICallChildServiceWorkflowCompleted" /> </client> <behaviors> ...
Finalización de la implementación de ChildService: por razones de simplicidad, en el cuerpo de este flujo de trabajo solamente se asignará el valor de la petición a la respuesta (ambas son cadenas predeterminadas; no obstante, en una implementación real, pueden actualizarse a contratos de datos).
Arrastre una actividad Delay desde el cuadro de herramientas a la secuencia Body. Configure la actividad Delay con las siguientes propiedades: Duration = New TimeSpan(0, 2, 0).
Arrastre una actividad Assign desde el cuadro de herramientas a la secuencia Body, justo después de la secuencia Delay. Configure la actividad Assign con las siguientes propiedades: To = response; Value = request.
Guarde el proyecto.
Habilitación del servicio para el hospedaje IIS/WAS: para configurar el flujo de trabajo para hospedaje en IIS/WAS y AppFabric, en el Explorador de soluciones, haga clic con el botón secundario en el proyecto ChildService (y no en la solución) y seleccione Propiedades.
Seleccione la tercera página de configuración (Web) y, en la sección Servidores, seleccione Usar servidor web de IIS local. Haga clic en Crear directorio virtual y, a continuación, en Aceptar en el cuadro de mensaje emergente. Guarde el proyecto.
Creación del flujo de trabajo de ParentService: en el Explorador de soluciones, haga clic con el botón secundario en la solución (no en el proyecto) y seleccione Agregar > Nuevo proyecto. Seleccione Aplicación de Servicio de flujo de trabajo de WCF para el tipo de proyecto y asigne al nuevo proyecto el nombre ParentService. Haga clic en Aceptar.
En el Explorador de soluciones, cambie el nombre de Service1.xamlx a ParentService.xamlx.
Arrastre la actividad CallWorkflowService desde el cuadro de herramientas a la superficie de diseño de WF, directamente a continuación de la actividad SendResponse. De este modo se abre el cuadro de diálogo de configuración para CallWorkflowService.
Use el botón “…” para ir a la definición de flujo de trabajo de ChildService.xamlx creada en los pasos anteriores y, a continuación, seleccione wsHttpContextBinding para coincidir con la selección del protocolo del paso 10. La ventana de configuración debe tener un aspecto similar al de la siguiente captura de pantalla.
Nota
Todas las opciones configuración para los nombres de operación y contrato de servicio de solicitud/respuesta se han descubierto automáticamente a partir de la definición del servicio secundario.
Haga clic en Aceptar.
Actualización del archivo web.config: El cuadro de diálogo Actualizaciones de Web.config se abre con las entradas necesarias para conectarse al servicio secundario. Tenga en cuenta que tanto la dirección del extremo secundario real como la dirección del extremo de devolución de llamada precisan la introducción de datos.
Haga clic en Copiar al Portapapeles & Cerrar. De este modo se copiarán al Portapapeles las entradas de web.config resaltadas, de modo que estén listas para pegarse en el archivo web.config. Haga clic en Aceptar en el cuadro de mensaje emergente.
Abra el archivo web.config del proyecto ParentService y pegue el contenido del Portapapeles directamente a continuación del elemento <system.serviceModel>.
Nota
Observe el comentario IMPORTANTE en el XML: el servicio principal también debe exponer un extremo para sus clientes. Para este ejemplo, puede usar el <extremo> de ejemplo definido como parte del comentario. El archivo web.config debe tener el aspecto siguiente:
... <system.serviceModel> <services> <service name="Service1"> <endpoint address="" binding="basicHttpBinding" contract="IService" /> <endpoint address="ChildCallback" binding="wsHttpContextBinding" contract="ICallChildService" name="Service1ICallChildServiceWorkflowCompleted" /> </service> </services> <client> <endpoint address="https://localhost/ChildService/ChildService.xamlx" binding="wsHttpContextBinding" bindingConfiguration="Service1ICallChildService_InitCallback" contract="ICallChildService" name="Service1ICallChildServiceStartWorkflow" /> </client> <bindings> <wsHttpContextBinding> <binding name="Service1ICallChildService_InitCallback" clientCallbackAddress="https://localhost/ParentService/ParentService.xamlx/ChildCallback" /> </wsHttpContextBinding> </bindings> <behaviors> <serviceBehaviors> ...
Finalización de la implementación de ParentService: el flujo de trabajo principal deberá transmitir valores de parámetros a la llamada de servicio al servicio secundario.
Para asignar un valor a la solicitud, arrastre una actividad Assign desde el cuadro de herramientas a la secuencia Call Workflow, justo antes de la actividad Send Request. Configure la actividad Assign con las siguientes propiedades: To = request; Value = data.ToString
Guarde el proyecto.
Habilitación de ParentService para el hospedaje IIS/WAS: para configurar el flujo de trabajo para hospedaje en IIS/WAS y AppFabric, en el Explorador de soluciones, haga clic con el botón secundario en el proyecto ParentService (y no en la solución) y seleccione Propiedades.
Seleccione la tercera página de configuración (Web) y, en la sección Servidores, seleccione Usar servidor web de IIS local. Haga clic en Crear directorio virtual y, a continuación, en Aceptar en el cuadro de mensaje emergente. Guarde el proyecto.
Genere la solución.
Configuración de IIS/WAS para hospedar los servicios durables ParentService y ChildService: inicie el Administrador de Internet Information Services (IIS). Haga clic en Inicio, Todos los programas, Microsoft AppFabric 1.1 para Windows Server y, a continuación, en Administrador de Internet Information Services (IIS).
En el panel izquierdo, expanda Sitios y, a continuación, la opción Sitio web predeterminado.
Localice la aplicación ChildService, haga clic con el botón secundario y seleccione Administrar aplicación. A continuación, seleccione Configuración avanzada.
Actualice la propiedad Protocolos habilitados de http a http,net.pipe. Observe que no hay ningún espacio detrás de la coma. Haga clic en Aceptar para confirmar los cambios.
Localice la aplicación ParentService, haga clic con el botón secundario y seleccione Administrar aplicación. A continuación, seleccione Configuración avanzada.
Actualice la propiedad Protocolos habilitados de http a http,net.pipe. Observe que no hay ningún espacio detrás de la coma. Haga clic en Aceptar para confirmar los cambios.
Ejecute WCFTestClient para iniciar una instancia del flujo de trabajo principal. Ejecute la aplicación WCF Test Client. Para ello, ejecute el comando siguiente: C:\Archivos de programa\Microsoft Visual Studio 10.0\Common7\IDE\WcfTestClient.exe (para plataformas de 32 bits) o "C:\Archivos de programa (x86)\Microsoft Visual Studio 10.0\Common7\IDE\WcfTestClient.exe" (para plataformas de 64 bits).
Seleccione Agregar->Agregar servicio para agregar una referencia al servicio principal, https://localhost/ParentService/ParentService.xamlx.
Una vez agregada la referencia, haga doble clic en el método GetData() y, a continuación, en el panel de la izquierda, escriba 123 como valor del parámetro int. Haga clic en Invocar.
Use el panel de AppFabric para comprobar el estado de las instancias ParentService y ChildService. Observará que, una vez finalizado ChildService, también finalizará el servicio principal, ya que recibe del servicio secundario la notificación de finalización.
Ejecución de este ejemplo: Opción 2
Inicie Visual Studio 2010 con permisos administrativos.
Importante Existen dos opciones para ejecutar este ejemplo. En este tema se proporcionan pasos para ambas. La Opción 1 presenta toda la experiencia del uso de las actividades WorkflowCallableSequence y CallWorkflowService para invocar un flujo de trabajo secundario desde uno principal, mientras que la opción 2 solamente considera la solución final: una implementación de dúplex durable listo para su ejecución que omite por completo la experiencia de diseño. Para obtener más información, vea la sección de demostración a continuación. Abra <ejemplos>\ Samples\Integration\Call Workflow (DurableDuplex)\DurableDuplex_with_CallWorkflowActivities\ DurableDuplex_with_CallWorkflowActivities.sln, donde <ejemplos> es la ruta de acceso en la que instaló los ejemplos de AppFabric.
Asegúrese de que se establece SampleClient como proyecto de inicio. Para ello, haga clic con el botón secundario en el proyecto SampleClient y, a continuación, haga clic en Establecer como proyecto de inicio.
Presione F5 para ejecutar el ejemplo. Comenzará la aplicación cliente de prueba del ejemplo.
Haga clic en Llamar servicio principal.
Observe el texto Instancias de flujo de trabajo. Muestra los eventos de inicio/finalización de los flujos de trabajo principal y secundario. En este ejemplo, el servicio principal inicia tres instancias del servicio secundario en paralelo, mediante la actividad ParallelForEach, y finaliza cuando han finalizado los tres servicios secundarios. También puede realizar un seguimiento de las instancias de servicio principal/secundario en ejecución mediante el panel de AppFabric.
Nota
El flujo de trabajo secundario entra en modo de suspensión durante dos minutos una vez iniciado. Durante este período, la instancia principal y todas las instancias secundarias pasan al modo inactivo y se conservan en el almacén de persistencia. Los eventos de finalización tienen lugar tras este período de dos minutos.
Eliminación de este ejemplo
inicie el Administrador de Internet Information Services (IIS). Haga clic en Inicio, Todos los programas, Microsoft AppFabric 1.1 para Windows Server y, a continuación, en Administrador de Internet Information Services (IIS).
Expanda el nodo del servidor de la vista en árbol de la izquierda. Expanda Sitios y, a continuación, Sitio web predeterminado.
Haga clic en el nodo SampleChildService y presione Quitar.
Haga clic en Sí para confirmar la eliminación de la aplicación seleccionada.
Haga clic en el nodo SampleParentService y presione Quitar.
Haga clic en Sí para confirmar la eliminación de la aplicación seleccionada.
Si siguió las instrucciones de la Opción 1 en “Ejecución de este ejemplo”, también deberá realizar lo siguiente:
Haga clic en el nodo ChildService y presione Quitar.
Haga clic en Sí para confirmar la eliminación de la aplicación seleccionada.
Haga clic en el nodo ParentService y presione Quitar.
Haga clic en Sí para confirmar la eliminación de la aplicación seleccionada.
Demuestra
Existen dos opciones para ejecutar este ejemplo. En este tema se proporcionan pasos para ambas. La Opción 1 se prefiere a la Opción 2 porque presenta toda la experiencia del uso de las actividades WorkflowCallableSequence y CallWorkflowService para invocar un flujo de trabajo secundario desde uno principal, que es el primer objetivo de este ejemplo. La Opción 2 solamente mira la solución final, una implementación de dúplex durable listo para su ejecución, y omite por completo la experiencia de diseño.
La Opción 1 de la sección “Ejecución de este ejemplo” demuestra cómo usar las dos actividades personalizadas de un proyecto.
En primer lugar, se crea el servicio de flujo de trabajo secundario; se elimina la actividad predeterminada del servicio Secuencial y, a continuación, se reemplaza con la “actividad” WorkflowCallableSequence. WorkflowCallableSequence es una fábrica de plantillas de actividad que, según las entradas del usuario, genera y configura las actividades de mensajería (Receive y Send) de modo que admitan la correlación de devolución de llamada. La correlación de devolución de llamada requiere que el contexto de solicitud contenga un símbolo (token) de contexto exclusivo que se usa para la correlación de devolución al elemento principal, así como la dirección de devolución de llamada a la que se debe enviar la notificación de finalización. La actividad Receive inicializa un identificador de correlación de devolución de llamada a partir de la solicitud de entrada, mientras que la actividad Send sigue dicho identificador para devolver la notificación de finalización al elemento principal en la dirección dinámica de devolución de llamada transmitida con la solicitud inicial.
La lógica WorkflowCallableSequence también genera las entradas de web.config para el servicio, los extremos de servicio y cliente y las entradas de enlace que sean necesarias.
El siguiente paso crea el servicio de flujo de trabajo principal. La fábrica de plantillas de actividad CallWorkflowService solicita la definición del elemento secundario, inspecciona su configuración y, a partir de esto, genera las actividades de mensajería (Send y Receive) necesarias para la comunicación dúplex durable con el elemento secundario. La actividad Send inicializa la correlación de devolución de llamada (lógicamente, éste es el paso donde se genera el símbolo (token) de contexto exclusivo y se transmite con la solicitud al flujo de trabajo secundario) y, a continuación, la actividad Receive correlaciona las notificaciones de finalización que vuelven del flujo de trabajo secundario mediante el mismo símbolo (token) de contexto (al correlacionarlo con el identificador de correlación inicializado en la actividad Send).
La lógica CallWorkflowService también genera las entradas de web.config para el servicio, los extremos de servicio y cliente y las entradas de enlace que sean necesarias. Observe el uso del atributo clientCallbackAddress en la definición de la configuración de enlace personalizada. Se trata de la dirección que se va a incluir en el mensaje de solicitud al cliente, de modo que pueda responder dinámicamente al autor correcto de la llamada (en este caso, el flujo de trabajo principal).
La Opción 2 de “Ejecución de este ejemplo” proporciona una solución dúplex durable y lista para su ejecución que se implementó mediante el uso de WorkflowCallableSequence en el flujo de trabajo secundario y CallWorkflowService en el flujo de trabajo principal.
El cliente realiza una llamada al servicio principal, que a su vez inicia tres instancias del servicio secundario en paralelo, mediante la actividad ParallelForEach. El servicio secundario, después de recibir el mensaje inicial del elemento principal, entra en modo de suspensión durante dos minutos (mediante una actividad Delay) y, después de este período, devuelve una notificación de finalización al elemento principal. El elemento principal únicamente finaliza cuando han finalizado todas las instancias del servicio secundario. Tanto la instancia principal como la secundaria registran entradas en el registro de eventos de aplicación, mediante el uso de “Ejemplos” como origen. La UI del cliente supervisa el registro de eventos de aplicación para que este origen de evento muestre los eventos de finalización en el cuadro de texto Instancias de flujo de trabajo.
2012-03-05