Compartilhar via


WorkflowPersistenceService.SaveWorkflowInstanceState Método

Definição

Quando implementado em uma classe derivada, salva o estado da instância de fluxo de trabalho em um armazenamento de dados.

protected public:
 abstract void SaveWorkflowInstanceState(System::Workflow::ComponentModel::Activity ^ rootActivity, bool unlock);
protected internal abstract void SaveWorkflowInstanceState (System.Workflow.ComponentModel.Activity rootActivity, bool unlock);
abstract member SaveWorkflowInstanceState : System.Workflow.ComponentModel.Activity * bool -> unit
Protected Friend MustOverride Sub SaveWorkflowInstanceState (rootActivity As Activity, unlock As Boolean)

Parâmetros

rootActivity
Activity

A atividade raiz da instância do fluxo de trabalho.

unlock
Boolean

true se a instância de fluxo de trabalho não deve ser bloqueada; false se a instância de fluxo de trabalho deve ser bloqueada.

Exemplos

O exemplo a seguir demonstra uma implementação do SaveWorkflowInstanceState método . Este exemplo é do exemplo de Serviço de Persistência Personalizada, do arquivo FilePersistenceService.cs. Para obter mais informações, consulte Exemplo de serviço de persistência personalizado.

// Save the workflow instance state at the point of persistence with option of locking the instance state if it is shared
// across multiple runtimes or multiple phase instance updates
protected override void SaveWorkflowInstanceState(Activity rootActivity, bool unlock)
{
    // Save the workflow
    Guid contextGuid = (Guid)rootActivity.GetValue(Activity.ActivityContextGuidProperty);
    Console.WriteLine("Saving instance: {0}\n", contextGuid);
    SerializeToFile(
        WorkflowPersistenceService.GetDefaultSerializedForm(rootActivity), contextGuid);

    // See when the next timer (Delay activity) for this workflow will expire
    TimerEventSubscriptionCollection timers = (TimerEventSubscriptionCollection)rootActivity.GetValue(TimerEventSubscriptionCollection.TimerCollectionProperty);
    TimerEventSubscription subscription = timers.Peek();
    if (subscription != null)
    {
        // Set a system timer to automatically reload this workflow when its next timer expires
        TimerCallback callback = new TimerCallback(ReloadWorkflow);
        TimeSpan timeDifference = subscription.ExpiresAt - DateTime.UtcNow;
        System.Threading.Timer timer = new System.Threading.Timer(
            callback,
            subscription.WorkflowInstanceId,
            timeDifference < TimeSpan.Zero ? TimeSpan.Zero : timeDifference,
            new TimeSpan(-1));
    }
}
' Save the workflow instance state at the point of persistence with option of locking the instance state if it is shared
' across multiple runtimes or multiple phase instance updates
Protected Overrides Sub SaveWorkflowInstanceState(ByVal rootActivity As System.Workflow.ComponentModel.Activity, ByVal unlock As Boolean)
    Dim contextGuid As Guid = CType(rootActivity.GetValue(Activity.ActivityContextGuidProperty), Guid)
    Console.WriteLine("Saving instance: 0}" + vbLf, contextGuid)
    SerializeToFile( _
        WorkflowPersistenceService.GetDefaultSerializedForm(rootActivity), contextGuid)

    ' See when the next timer (Delay activity) for this workflow will expire
    Dim timers As TimerEventSubscriptionCollection = CType(rootActivity.GetValue(TimerEventSubscriptionCollection.TimerCollectionProperty), TimerEventSubscriptionCollection)
    Dim subscription As TimerEventSubscription = timers.Peek()
    If subscription IsNot Nothing Then
        ' Set a system timer to automatically reload this workflow when it's next timer expires
        Dim timeDifference As TimeSpan = subscription.ExpiresAt - DateTime.UtcNow
        Dim callback As TimerCallback = New TimerCallback(AddressOf ReloadWorkflow)
        Dim timer As New System.Threading.Timer( _
            callback, _
            subscription.WorkflowInstanceId, _
            CType(IIf(timeDifference < TimeSpan.Zero, TimeSpan.Zero, timeDifference), TimeSpan), _
            New TimeSpan(-1))
    End If
End Sub

Comentários

Você deve chamar um dos métodos sobrecarregados Save para serializar rootActivity em um Stream. Em seguida, você pode optar por processar o Stream antes de escrevê-lo no armazenamento de dados. No entanto, quando o mecanismo de runtime de fluxo de trabalho chama LoadWorkflowInstanceState, você deve restaurar uma cópia idêntica da atividade raiz. Se você não puder salvar o estado da instância de fluxo de trabalho em seu armazenamento de dados, deverá lançar um com uma PersistenceException mensagem de erro apropriada.

O mecanismo de runtime de fluxo de trabalho fornece semântica de bloqueio para restringir o acesso a um estado de instância de fluxo de trabalho salvo no armazenamento de dados. Isso pode ser acessado pelos serviços de persistência em execução em vários hosts e apontando para o mesmo armazenamento de dados. A semântica de bloqueio foi projetada para impedir que os serviços de persistência executados em dois runtimes de fluxo de trabalho diferentes carreguem a mesma instância de fluxo de trabalho na memória ao mesmo tempo. Dependendo do tipo de ambiente em que seu serviço de persistência foi projetado para dar suporte, você pode escolher se deseja dar suporte a essa funcionalidade. Se você optar por dar suporte à semântica de bloqueio de runtime, se um serviço de persistência tentar salvar um estado de instância de fluxo de trabalho que foi bloqueado anteriormente por outro serviço de persistência, você deverá lançar um WorkflowOwnershipException. Se unlock for true, você deverá desbloquear o acesso ao estado da instância de fluxo de trabalho depois de salvá-lo.

LoadWorkflowInstanceState usa o Guid da instância de fluxo de trabalho como um parâmetro. Portanto, você deve salvar este Guid. Você também pode usar isso Guid para associar a instância de fluxo de trabalho aos estados salvos de seus escopos concluídos. Você deve fazer isso porque deve ser capaz de marcar esses escopos concluídos como desnecessários quando a instância de fluxo de trabalho for concluída.

O mecanismo de runtime de fluxo de trabalho chama SaveWorkflowInstanceState uma hora final quando a instância de fluxo de trabalho é concluída ou encerrada. Portanto, se GetWorkflowStatus for igual a Completed ou Terminated, você poderá excluir com segurança a instância de fluxo de trabalho e todos os seus escopos concluídos associados do armazenamento de dados. Como alternativa, você pode assinar os WorkflowCompleted eventos ou WorkflowTerminated para determinar quando é seguro excluir registros associados à instância de fluxo de trabalho. Se você realmente excluir os registros do armazenamento de dados depende de sua implementação.

Se você implementar um serviço de persistência que usa um repositório durável, para manter a consistência com o estado interno do mecanismo de runtime de fluxo de trabalho, deverá participar do envio em lote de transações de fluxo de trabalho para adiar a gravação real em seu repositório durável até um ponto de confirmação de fluxo de trabalho. Para participar do envio em lote, adicione um item de trabalho que represente as alterações pendentes no repositório durável à WorkBatch propriedade e implemente a IPendingWork interface em seu serviço de persistência.

Aplica-se a