Compartilhar via


Instâncias de fluxo de trabalho não persistentes

Quando uma nova instância de um fluxo de trabalho é criada que persiste seu estado em SqlWorkflowInstanceStore, o host serviço cria uma entrada para o serviço no armazenamento de instância. Posteriormente, quando a instância de fluxo de trabalho é persistida pela primeira vez, o SqlWorkflowInstanceStore armazena o estado da instância atual. Se o fluxo de trabalho estiver hospedado no Serviço de Ativação de Processo do Windows, os dados de implantação do serviço também serão gravados no repositório de instâncias quando a instância for mantida pela primeira vez.

Desde que a instância de fluxo de trabalho não tenha sido mantida, ela está em um estado não persistente . Nesse estado, a instância de fluxo de trabalho não pode ser recuperada após uma reciclagem de domínio do aplicativo, falha de host ou falha no computador.

O estado não persistente

As instâncias duráveis de fluxo de trabalho que não foram persistentes permanecem em um estado não mantido nos seguintes casos:

  • Falhas de host serviço antes de instância de fluxo de trabalho são mantidas pela primeira vez. A instância de fluxo de trabalho permanece no repositório de instâncias e não é recuperada. Se uma mensagem correlacionada chegar, a instância do fluxo de trabalho ficará ativa novamente.

  • A instância de fluxo de trabalho apresenta uma exceção antes de ser mantidas pela primeira vez. Dependendo do UnhandledExceptionAction retornado, ocorrem os seguintes cenários:

    • UnhandledExceptionAction é definido como Abort: quando ocorre uma exceção, as informações de implantação de serviço são gravadas no repositório de instâncias e a instância do fluxo de trabalho é descarregada da memória. A instância de fluxo de trabalho permanece em um estado não persistente e não pode ser recarregada.

    • UnhandledExceptionAction é definido como Cancel ou Terminate: Quando ocorre uma exceção, as informações de implantação de serviço são gravadas no repositório de instâncias e o estado da instância de atividade é definido como Closed.

Para minimizar o risco de localizar instâncias são persistentes descarregadas de fluxo de trabalho, recomendamos persistir o fluxo de trabalho no início em seu ciclo de vida.

Detecção e remoção de instâncias são persistentes

O SqlWorkflowInstanceStore não remove nenhuma instância de fluxo de trabalho não persistente do repositório de instâncias. Também não remove quaisquer proprietários expiradas de bloqueio que não persistiram as instâncias de fluxo de trabalho associados com eles.

Recomendamos que o administrador verifique periodicamente o repositório de instâncias em busca de instâncias não persistentes. Os administradores podem remover essas instâncias do repositório de instâncias, desde que saibam que esse fluxo de trabalho não receberá mensagens correlacionadas. Por exemplo, se a instância estiver no banco de dados por vários meses e se souber que o fluxo de trabalho normalmente tem um tempo de vida de vários dias, seria seguro supor que essa era uma instância inicializada que havia falhado.

Para localizar instâncias não persistentes no Repositório de Instâncias de Fluxo de Trabalho do SQL, você pode usar as seguintes consultas SQL:

  • Essa consulta localiza todas as instâncias que não foram persistidas e retorna a ID e o tempo de criação (armazenados no horário UTC) para elas.

    select InstanceId, CreationTime
        from [System.Activities.DurableInstancing].[Instances]
        where IsInitialized = 0
    
  • Essa consulta localiza todas as instâncias que não foram persistidas e que não são carregadas e retorna a ID e o tempo de criação (armazenados no horário UTC) para elas.

    select InstanceId, CreationTime
        from [System.Activities.DurableInstancing].[Instances]
        where IsInitialized = 0
            and CurrentMachine is NULL
    
  • Essa consulta localiza todas as instâncias suspensas que não foram mantidas e retorna a ID, a hora de criação (armazenada no horário UTC), o motivo da suspensão e o nome da exceção para elas.

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

Use cuidado quando você estiver excluindo instâncias são persistentes. Em geral, é seguro remover instâncias não persistentes criadas por WorkflowServiceHost que estão suspensas ou não estão carregadas. Essas instâncias específicas podem ser excluídas do repositório excluindo-as da [System.Activities.DurableInstancing].[Instances] exibição usando o seguinte comando SQL, substituindo a ID da instância correta.

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

Aviso

Não recomendamos remover todas as instâncias não persistentes porque isso inclui instâncias que acabaram de ser criadas e ainda não foram mantidas.