Pregunta

Actualmente estamos construyendo un sistema que abstrae todo tipo de detalles técnicos sobre servicios web de otros sistemas. Es un poco como un Enterprise Bus, pero hace un poco más.

Decidimos usar el flujo de trabajo de Windows para manejar las solicitudes. Tan pronto como descubramos qué tipo de acción se solicita, comenzaremos un flujo de trabajo específicamente diseñado para manejar la acción. Ahora, algunos de los servicios web a los que llamaremos son asíncronos, por lo que el flujo de trabajo debe esperar una respuesta. La idea básica es que implementaremos el servicio web de devolución de llamada de nuestra parte y cuando la devolución de llamada llegue 'de alguna manera' proporcione sus datos al flujo de trabajo en ejecución que está esperando la respuesta.

Hasta ahora he visto dos posibilidades:

  1. el ExternalDataExchangeService
  2. el WorkflowQueuingService

El primer servicio es relativamente fácil de usar, pero está basado en eventos, por lo que si pierde el evento, pierde los datos. Necesitamos una solución basada en la cola, porque es técnicamente posible recibir la devolución de llamada de un servicio web incluso antes de que recibamos la respuesta sincrónica que nos dice que recibiremos una devolución de llamada en breve.

El segundo servicio parecía perfecto, pero es muy limitante en la forma en que se puede usar. Introducir un elemento en la cola es muy sencillo, pero debemos asegurarnos de que la cola exista antes de poder hacerlo. Y la creación de la cola solo parece ser posible en el reemplazo de Ejecución de una Actividad. Como tenemos muchos flujos de trabajo diferentes, tenemos una clase de flujo de trabajo base que realiza algunos trabajos en su anulación de Inicializar y nos gustaría mucho hacer la creación de la cola allí, por lo que no tendremos que crear un " Inicializar " actividad con la que todo flujo de trabajo debe comenzar. También nos gustaría recibir la notificación de cuándo se recibe un nuevo elemento para estar en la clase base. Por lo tanto, el flujo de trabajo específico solo tendría que esperar en WaitHandle para saber que hay datos en la cola. Finalmente, queremos poder leer los datos de la cola de una Actividad de código en el flujo de trabajo específico (después de que se indique WaitHandle).

¿Alguien tiene una idea? No tiene que estar con los dos servicios que mencioné, pero realmente nos gustaría mantener las cosas lo más simples posible.

¿Fue útil?

Solución 2

Resulta que mi suposición era incorrecta. Estaba 100% seguro de que había probado el escenario y me encontré con problemas, pero después de una discusión con un colega, lo volví a probar y ExternalDataExchangeService funcionó bien. Por lo tanto, no es necesario encontrar una solución más compleja, por ahora solo vamos con ExternalDataExchangeService.

Otros consejos

En WF, todas las comunicaciones entre el tiempo de ejecución o los servicios y los flujos de trabajo reales se basan en la cola. El ExternalDataExchangeService parece usar eventos, pero estos son solo una capa delgada alrededor del mecanismo WorkflowQueuingService y WorkflowQueue.

En general, prefiero usar WorkflowQueuingService ya que proporciona control total. Una vez que comprenda los conceptos básicos, es aún más fácil trabajar con ese ExternalDataExchangeService en la mayoría de los casos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top