Compartir a través de


Acción de excepción de instancia bloqueada

Este tema es aplicable a Windows Workflow Foundation 4.

La propiedad Acción de excepción bloqueada de instancia del almacén de instancias de flujo de trabajo de SQL le permite especificar qué acción debe realizar el proveedor de persistencia de SQL cuando recibe una excepción del tipo InstanceLockedException. El proveedor de persistencia recibe esta excepción cuando intenta bloquear una instancia de servicio del flujo de trabajo que ya está bloqueada actualmente por otro host del servicio. Los valores permitidos para esta propiedad son No Retry, Basic Retry y Aggresive Retry. El valor predeterminado es No Retry. En la lista siguiente se describen las tres opciones:

  • No Retry (valor predeterminado). El proveedor de persistencia no reintenta bloquear la instancia y pasa InstanceLockedException al autor de la llamada.

  • Basic Retry. El proveedor de persistencia reintenta bloquear la instancia con un intervalo de reintento lineal y, o bien tiene éxito para bloquear la instancia o pasa InstanceLockedException al autor de llamada al final de la secuencia.

  • Aggressive Retry. El proveedor de persistencia reintenta bloquear la instancia con un retraso creciente exponencialmente y, o bien tiene éxito a la hora de bloquear la instancia o pasa InstanceLockedException al autor de llamada al final de la secuencia. Al principio los intervalos son cortos en un intento de adquirir el bloqueo tan rápidamente como sea posible. Los intervalos se harán más largos con cada intento fallido.

La característica Acción de excepción bloquedada de instancia admite los siguientes escenarios. En todos los escenarios, si la propiedad instanceLockedExceptionAction de SqlWorkflowInstanceStore está establecida en BasicRetry o AggressiveRetry, el host reintenta adquirir el bloqueo en instancias periódicamente de forma transparente.

  1. Permitir el apagado estable y el reciclaje superpuesto de dominios de aplicación. Supongamos que se está reciclando un Appdomain con un host de servicio que esté ejecutando instancias de servicio de flujo de trabajo y que se plantea un nuevo Appdomain para administrar las nuevas solicitudes en paralelo mientras se acaba sin contratiempos con el Appdomain antiguo. El apagado espera hasta que las instancias de servicio del flujo de trabajo estén inactivas, y, a continuación, conserva y descarga las instancias. Cualquier intento por parte de los hosts en el nuevo Appdomain para bloquear una instancia producirá una InstanceLockedException.

  2. Escalado horizontal de flujos de trabajo de duración en una granja homogénea de servidores. Supongamos que hay un nodo de una granja de servidores en el que una instancia de flujo de trabajo está ejecutando bloqueos y el host del flujo de trabajo no puede quitar los bloqueos en la instancia que está ejecutando. Cuando un host del servicio que se ejecuta en otro nodo de la granja recibe un mensaje para esa instancia de flujo de trabajo, intenta adquirir los bloqueos en estas instancias y recibirá InstanceLockedException. Los bloqueos expirarán después de algún tiempo porque el host que se suponía que iba a renovar el bloqueo ya no existe.

    Escalado horizontal de flujos de trabajo de duración en una granja homogénea de servidores. Supongamos que desea escalar un flujo de trabajo de duración de manera horizontal usando varios hosts detrás de un NLB (equilibrador de carga de red). El host del flujo de trabajo que se ejecuta en un nodo de la granja carga una instancia de flujo de trabajo y está procesando un mensaje, y el mensaje siguiente a la instancia se enruta hacia el host que se está ejecutando en otro nodo porque el NLB no tiene el algoritmo de enrutamiento para entregar los mensajes al host que ya está ejecutando la instancia. Al recibir el mensaje, el segundo host intenta cargar la instancia de flujo de trabajo y recibe InstanceLockedException porque el primer host tiene un bloqueo en la instancia. El primer host desbloqueará la instancia cuando haya terminado de procesar el primer mensaje y el segundo host adquirirá el bloqueo cuando lo vuelva a intentar la próxima vez, cargue la instancia y procese el segundo mensaje.