Instâncias de fluxo de trabalho não persistentes
Quando uma nova instância de um fluxo de trabalho é criada que persiste seu estado no SqlWorkflowInstanceStore, o host de serviço cria uma entrada para esse serviço no armazenamento de instâncias. Posteriormente, quando a instância do fluxo de trabalho é persistida pela primeira vez, o armazena SqlWorkflowInstanceStore o estado atual da instância. Se o fluxo de trabalho estiver hospedado no Serviço de Ativação de Processos do Windows, os dados de implantação do serviço também serão gravados no armazenamento de instâncias quando a instância for persistida pela primeira vez.
Desde que a instância do fluxo de trabalho não tenha sido persistida, ela estará em um estado não persistente . Enquanto estiver nesse estado, a instância do fluxo de trabalho não pode ser recuperada após uma reciclagem de domínio de aplicativo, falha de host ou falha de computador.
O Estado Não Persistente
As instâncias de fluxo de trabalho duráveis que não foram persistidas permanecem em um estado não persistente nos seguintes casos:
O host de serviço falha antes que a instância do fluxo de trabalho seja persistida pela primeira vez. A instância do fluxo de trabalho permanece no armazenamento 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 do fluxo de trabalho experimenta uma exceção antes de ser persistida pela primeira vez. Dependendo do UnhandledExceptionAction retornado, os seguintes cenários ocorrem:
UnhandledExceptionAction é definido como Abort: Quando ocorre uma exceção, as informações de implantação do serviço são gravadas no armazenamento de instâncias e a instância do fluxo de trabalho é descarregada da memória. A instância do 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 do serviço são gravadas no armazenamento de instâncias e o estado da instância de atividade é definido como Closed.
Para minimizar o risco de encontrar instâncias de fluxo de trabalho não persistentes descarregadas, recomendamos persistir o fluxo de trabalho no início de seu ciclo de vida.
Deteção e remoção de instâncias não persistentes
O SqlWorkflowInstanceStore não remove nenhuma instância de fluxo de trabalho não persistente do armazenamento de instâncias. Ele também não remove nenhum proprietário de bloqueio expirado que tenha instâncias de fluxo de trabalho não persistentes associadas a eles.
Recomendamos que o administrador verifique periodicamente o armazenamento de instâncias em busca de instâncias não persistentes. Os administradores podem remover essas instâncias do armazenamento 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 assumir que essa foi uma instância inicializada que falhou.
Para localizar instâncias não persistentes no Repositório de Instâncias do Fluxo de Trabalho 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 estã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 persistidas e retorna a ID, o tempo de criação (armazenado 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
Tenha cuidado ao excluir instâncias não persistentes. Em geral, é seguro remover instâncias não persistentes criadas por WorkflowServiceHost que estão suspensas ou não são carregadas. Essas instâncias específicas podem ser excluídas do armazenamento 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 a remoção de todas as instâncias não persistentes porque isso inclui instâncias que acabaram de ser criadas e ainda não foram persistidas.