Compartir a través de


Instancias de flujo de trabajo no persistentes

Cuando se crea una nueva instancia de un flujo de trabajo que conserva su estado en SqlWorkflowInstanceStore, el host de servicio crea una entrada para ese servicio en el almacén de instancias. Posteriormente, cuando la instancia de flujo de trabajo se conserva por primera vez, SqlWorkflowInstanceStore almacena el estado de la instancia actual. Si el flujo de trabajo se hospeda en el Servicio de Activación de Procesos de Windows, los datos de implementación del servicio también se escriben en el almacenamiento de instancias cuando la instancia persiste por primera vez.

Siempre que la instancia de flujo de trabajo no se haya conservado, se encuentra en un estado no persistente . Mientras se encuentra en este estado, la instancia de flujo de trabajo no se puede recuperar después de un reciclaje de dominio de aplicación, un error de host o un error del equipo.

El estado no persistente

Las instancias de flujo de trabajo duraderas que no se han conservado permanecen en un estado no persistente en los casos siguientes:

  • El host del servicio se bloquea antes de que la instancia de flujo de trabajo se guarde por primera vez. La instancia de flujo de trabajo permanece en el repositorio de instancias y no se recupera. Si llega un mensaje correlacionado, la instancia de flujo de trabajo vuelve a estar activa.

  • La instancia de flujo de trabajo experimenta una excepción antes de ser guardada por primera vez. Dependiendo del UnhandledExceptionAction devuelto, se producen los siguientes escenarios:

    • UnhandledExceptionAction se establece en Abort: cuando se produce una excepción, la información de implementación del servicio se escribe en el almacén de instancias y la instancia de flujo de trabajo se descarga de la memoria. La instancia de flujo de trabajo permanece en un estado no persistente y no se puede volver a cargar.

    • UnhandledExceptionAction se establece en Cancel o Terminate: Cuando se produce una excepción, la información de implementación del servicio se escribe en el almacén de instancias y el estado de la instancia de actividad se establece en Closed.

Para minimizar el riesgo de encontrar descargadas instancias de flujo de trabajo no persistentes, recomendamos conservar el flujo de trabajo temprano en su ciclo de vida.

Detección y eliminación de instancias no persistentes

SqlWorkflowInstanceStore no quita cualquier instancia de flujo de trabajo no persistente del almacén de la instancia. Tampoco quita cualquier propietario de bloqueo caducado que esté asociado con instancias de flujo de trabajo no persistentes.

Se recomienda que el administrador revise periódicamente el almacén de instancias en busca de aquellas que no sean persistentes. Los administradores pueden quitar esas instancias del almacén de instancias siempre que sepan que este flujo de trabajo no recibirá mensajes correlacionados. Por ejemplo, si la instancia ha estado en la base de datos durante varios meses y se sabe que el flujo de trabajo normalmente tiene una duración de varios días, sería seguro suponer que se trataba de una instancia inicializada que se había bloqueado.

Para buscar instancias no persistentes en el almacén de instancias de flujo de trabajo de SQL, puede usar las siguientes consultas SQL:

  • Esta consulta busca todas las instancias que no se han guardado y devuelve su identificador y la hora de creación (almacenada en tiempo UTC).

    select InstanceId, CreationTime
        from [System.Activities.DurableInstancing].[Instances]
        where IsInitialized = 0
    
  • Esta consulta busca todas las instancias que no se han conservado y que no se cargan y devuelven el identificador y la hora de creación (almacenadas en hora UTC) para ellas.

    select InstanceId, CreationTime
        from [System.Activities.DurableInstancing].[Instances]
        where IsInitialized = 0
            and CurrentMachine is NULL
    
  • Esta consulta busca todas las instancias suspendidas que no se han conservado y devuelve el identificador, la hora de creación (almacenada en hora UTC), el motivo de la suspensión y el nombre de excepción para ellas.

    select InstanceId, CreationTime, SuspensionReason, SuspensionExceptionName
        from [System.Activities.DurableInstancing].[Instances]
        where IsInitialized = 0
            and IsSuspended = 1
    

Use cuidado al eliminar instancias no persistentes. En general, es seguro quitar las instancias no persistentes creadas por WorkflowServiceHost que estén suspendidas o que no estén cargadas. Esas instancias específicas se pueden eliminar del almacén eliminandolas de la [System.Activities.DurableInstancing].[Instances] vista mediante el siguiente comando SQL, sustituyendo el identificador de instancia correcto.

delete [System.Activities.DurableInstancing].[Instances]
    where InstanceId=’078a9bc4-ada5-4f9e-8cce-b0eb0009995f’

Advertencia

No recomendamos quitar todos instancias no persistentes, porque esto incluye instancias que se han creado recientemente y todavía no se han guardado.