Partilhar via


Como consultar instâncias não persistentes

Quando uma nova instância de um serviço é criada e o serviço tem o comportamento do Repositório de Instâncias do Fluxo de Trabalho SQL definido, o host do serviço cria uma entrada inicial para essa instância de serviço no repositório de instâncias. Subsequentemente, quando a instância de serviço persiste pela primeira vez, o comportamento do Repositório de Instâncias do Fluxo de Trabalho SQL armazena o estado atual da instância juntamente com dados adicionais necessários para ativação, recuperação e controle.

Se uma instância não for persistida após a entrada inicial para a instância ser criada, a instância de serviço será considerada no estado não persistente. Todas as instâncias de serviço persistentes podem ser consultadas e controladas. As instâncias de serviço não persistentes não podem ser consultadas nem controladas. Se uma instância não persistente for suspensa devido a uma exceção não tratada, ela poderá ser consultada, mas não controlada.

As instâncias de serviço duráveis que ainda não foram persistidas permanecem em um estado não persistente nos seguintes cenários:

  • O host de serviço falha antes que a instância persista pela primeira vez. A entrada inicial para a instância permanece no armazenamento de instâncias. A instância não é recuperável. Se uma mensagem correlacionada chegar, a instância ficará ativa novamente.

  • A instância experimenta uma exceção não tratada antes de persistir pela primeira vez. Surgem os seguintes cenários

    • Se o valor da propriedade UnhandledExceptionAction estiver definido como Abandon, as informações de implantação do serviço serão gravadas no armazenamento de instâncias e a instância será descarregada da memória. A instância permanece em estado não persistente no banco de dados de persistência.

    • Se o valor da propriedade UnhandledExceptionAction estiver definido como AbandonAndSuspend, as informações de implantação do serviço serão gravadas no banco de dados de persistência e o estado da instância será definido como Suspended. A instância não pode ser retomada, cancelada ou encerrada. O host de serviço não pode carregar a instância porque a instância ainda não persistiu e, portanto, a entrada do banco de dados para a instância não está concluída.

    • Se o valor da propriedade UnhandledExceptionAction estiver definido como Cancel ou Terminate, as informações de implantação do serviço serão gravadas no armazenamento de instâncias e o estado da instância será definido como Completed.

As seções a seguir fornecem consultas de exemplo para localizar instâncias não persistentes no banco de dados de persistência SQL e excluir essas instâncias do banco de dados.

Para localizar todas as instâncias ainda não persistidas

A consulta SQL a seguir retorna a ID e o tempo de criação para todas as instâncias que ainda não persistem no banco de dados de persistência.

select InstanceId, CreationTime from [System.Activities.DurableInstancing].[Instances] where IsInitialized = 0;

Para localizar todas as instâncias ainda não persistentes e também não carregadas

A consulta SQL a seguir retorna ID e tempo de criação para todas as instâncias que não são persistentes e também não são carregadas.

select InstanceId, CreationTime from [System.Activities.DurableInstancing].[Instances] where IsInitialized = 0 and CurrentMachine is NULL;

Para localizar todas as instâncias suspensas ainda não persistidas

A consulta SQL a seguir retorna ID, tempo de criação, motivo da suspensão e nome da exceção de suspensão para todas as instâncias que não são persistentes e também em um estado suspenso.

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

Para excluir instâncias não persistentes do banco de dados de persistência

Você deve verificar periodicamente o armazenamento de instâncias não persistentes e remover instâncias do armazenamento de instâncias se tiver certeza de que a instância não receberá uma mensagem correlacionada. Por exemplo, se a instância estiver no banco de dados por vários meses e você souber que o fluxo de trabalho normalmente tem um tempo de vida de alguns dias, seria seguro assumir que essa é uma instância não inicializada que falhou.

Em geral, é seguro excluir instâncias não persistentes que não estão suspensas ou não carregadas. Você não deve excluir todas as instâncias não persistentes porque esse conjunto de instâncias inclui instâncias que acabaram de ser criadas, mas ainda não foram persistidas. Você só deve excluir instâncias não persistentes que sobraram porque o host do serviço de fluxo de trabalho que teve a instância carregada causou uma exceção ou a própria instância causou uma exceção.

Aviso

A exclusão de instâncias não persistentes do repositório de instâncias diminui o tamanho do repositório e pode melhorar o desempenho das operações do armazenamento.