Participantes de Persistência
Um participante de persistência pode participar de uma operação de persistência (Save or Load) acionada por um host de aplicativo. O .NET Framework 4.6.1 vem com duas classes abstratas, PersistenceParticipant e PersistenceIOParticipant, que você pode usar para criar um participante de persistência. Um participante de persistência deriva de uma dessas classes, implementa os métodos de interesse e, em seguida, adiciona uma instância da classe à WorkflowExtensions coleção no WorkflowServiceHost . O host do aplicativo pode procurar essas extensões de fluxo de trabalho ao persistir uma instância de fluxo de trabalho e invocar métodos apropriados nos participantes de persistência nos momentos apropriados.
A lista a seguir descreve as tarefas executadas pelo subsistema de persistência em diferentes estágios da operação Persistir (Salvar). Os participantes da persistência são utilizados na terceira e quarta etapas. Se o participante for um participante de E/S (um participante de persistência que também participa de operações de E/S), o participante também será usado no sexto estágio.
Reúne valores internos, incluindo estado do fluxo de trabalho, marcadores, variáveis mapeadas e carimbo de data/hora.
Reúne todos os participantes de persistência que foram adicionados à coleção de extensão associada à instância do fluxo de trabalho.
Invoca o CollectValues método implementado por todos os participantes de persistência.
Invoca o MapValues método implementado por todos os participantes de persistência.
Persista ou salve o fluxo de trabalho no repositório de persistência.
Invoca o BeginOnSave método em todos os participantes de E/S de persistência. Se o participante não for um participante de E/S, esta tarefa será ignorada. Se o episódio de persistência for transacional, a transação será fornecida na propriedade Transaction.Current.
Aguarda que todos os participantes da persistência completem. Se todos os participantes conseguirem persistir os dados da instância, confirmará a transação.
Um participante de persistência deriva da classe PersistenceParticipant e pode implementar os métodos CollectValues e MapValues . Um participante de E/S de persistência deriva da classe PersistenceIOParticipant e pode implementar o método BeginOnSave além de implementar os métodos CollectValues e MapValues .
Cada etapa é concluída antes do início da próxima etapa. Por exemplo, os valores são coletados de todos os participantes da persistência na primeira etapa. Em seguida, todos os valores coletados na primeira etapa são fornecidos a todos os participantes da persistência na segunda etapa para mapeamento. Em seguida, todos os valores coletados e mapeados no primeiro e segundo estágios são fornecidos ao provedor de persistência no terceiro estágio, e assim por diante.
A lista a seguir descreve as tarefas executadas pelo subsistema de persistência em diferentes estágios da operação Load. Os participantes da persistência são usados na quarta etapa. Os participantes de E/S de persistência (participantes de persistência que também participam de operações de E/S) também são usados no terceiro estágio.
Reúne todos os participantes de persistência que foram adicionados à coleção de extensão associada à instância do fluxo de trabalho.
Carrega o fluxo de trabalho do repositório de persistência.
Invoca todos os participantes de BeginOnLoad E/S de persistência e aguarda a conclusão de todos os participantes de persistência. Se o episódio de persistência for transacional, a transação será fornecida em Transaction.Current.
Carrega a instância do fluxo de trabalho na memória com base nos dados recuperados do repositório de persistência.
Invoca PublishValues em cada participante de persistência.
Um participante de persistência deriva da classe PersistenceParticipant e pode implementar o método PublishValues . Um participante de E/S de persistência deriva da classe PersistenceIOParticipant e pode implementar o método BeginOnLoad além de implementar o método PublishValues .
Ao carregar uma instância de fluxo de trabalho, o provedor de persistência cria um bloqueio nessa instância. Isso impede que a instância seja carregada por mais de um host em um cenário de vários nós. Se você tentar carregar uma instância de fluxo de trabalho que foi bloqueada, verá uma exceção como a seguinte: A exceção " System.ServiceModel.Persistence.InstanceLockException: A operação solicitada não pôde ser concluída porque o bloqueio, por exemplo, '00000000-0000-0000-0000-000000000000' não pôde ser adquirido". Este erro é causado quando ocorre uma das seguintes situações:
Em um cenário de vários nós, a instância é carregada por outro host. Existem algumas maneiras diferentes de resolver esses tipos de conflitos: encaminhar o processamento para o nó que possui o bloqueio e tentar novamente, ou forçar a carga que fará com que o outro host não consiga salvar seu trabalho.
Em um cenário de nó único e o host travou. Quando o host é iniciado novamente (um processo, recicla ou cria uma nova fábrica de provedor de persistência), o novo host tenta carregar uma instância que ainda está bloqueada pelo host antigo porque o bloqueio ainda não expirou.
Em um cenário de nó único e a instância em questão foi abortada em algum momento e uma nova instância de provedor de persistência é criada que tem um ID de host diferente.
O valor de tempo limite de bloqueio tem um valor padrão de 5 minutos, você pode especificar um valor de tempo limite diferente ao chamar Load.