다음을 통해 공유


WorkflowPersistenceService.SaveWorkflowInstanceState 메서드

정의

파생 클래스에서 구현되는 경우 워크플로 인스턴스 상태를 데이터 저장소에 저장합니다.

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)

매개 변수

rootActivity
Activity

워크플로 인스턴스의 루트 활동입니다.

unlock
Boolean

워크플로 인스턴스를 잠그지 않아야 하면 true이고, 워크플로 인스턴스를 잠가야 하면 false입니다.

예제

다음 예제에서는 SaveWorkflowInstanceState 메서드의 구현 방법을 보여 줍니다. 이 예제는 FilePersistenceService.cs 파일에 있는 Custom Persistence Service 샘플의 일부입니다. 자세한 내용은 Custom Persistence Service 샘플합니다.

// 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

설명

오버로드된 Save 메서드 중 하나를 호출하여 rootActivityStream으로 serialize해야 합니다. 데이터 저장소에 쓰기 전에 Stream을 추가로 처리하도록 선택할 수 있습니다. 그러나 워크플로 런타임 엔진이 LoadWorkflowInstanceState를 호출할 때 루트 활동의 동일한 복사본을 복원해야 합니다. 워크플로 인스턴스 상태를 데이터 저장소에 저장할 수 없는 경우 해당 오류 메시지와 함께 PersistenceException을 throw해야 합니다.

워크플로 런타임 엔진은 잠금 의미 체계를 제공하여 데이터 저장소에 저장된 워크플로 인스턴스 상태에 대한 액세스를 제한합니다. 워크플로 인스턴스 상태는 호스트에서 실행되고 동일한 데이터 저장소를 가리키는 지속성 서비스로 액세스할 수 있습니다. 잠금 의미 체계는 두 개의 다른 워크플로 런타임에서 실행되는 지속성 서비스가 동일한 워크플로 인스턴스를 동시에 메모리에 로드할 수 없도록 디자인되었습니다. 지속성 서비스가 지원하도록 디자인된 환경 유형에 따라 이 기능의 지원 여부를 선택할 수 있습니다. 런타임 잠금 의미 체계를 지원하도록 선택하면 지속성 서비스가 이전에 다른 지속성 서비스에서 잠긴 워크플로 인스턴스 상태를 저장하려고 시도하는 경우 WorkflowOwnershipException을 throw해야 합니다. unlocktrue이면 저장 후 워크플로 인스턴스 상태에 대한 액세스를 잠금 해제해야 합니다.

LoadWorkflowInstanceState는 워크플로 인스턴스의 Guid를 매개 변수로 사용합니다. 따라서 이 Guid를 저장해야 합니다. 이 Guid를 사용하여 워크플로 인스턴스를 완료된 범위의 저장된 상태와 연결할 수도 있습니다. 워크플로 인스턴스가 완료될 때 완료된 범위를 필요하지 않은 것으로 표시할 수 있으려면 이 작업을 수행해야 합니다.

워크플로 런타임 엔진은 워크플로 인스턴스가 최종적으로 완료되거나 종료될 때 SaveWorkflowInstanceState를 호출합니다. 따라서 GetWorkflowStatusCompleted 또는 Terminated와 같으면 워크플로 인스턴스 및 연결된 모든 완료된 범위를 데이터 저장소에서 안전하게 삭제할 수 있습니다. 또는 WorkflowCompleted 또는 WorkflowTerminated 이벤트를 구독하여 워크플로 인스턴스와 연결된 레코드를 안전하게 삭제할 수 있는 시기를 확인할 수 있습니다. 실제로 데이터 저장소에서 레코드를 삭제할지 여부는 구현에 따라 달라집니다.

영속 저장소를 사용하는 지속성 서비스를 구현하는 경우 워크플로 런타임 엔진의 내부 상태와 일관성을 유지하려면 워크플로 트랜잭션 일괄 처리에 참여하여 영속 저장소에 대한 실제 쓰기를 워크플로 커밋 점까지 지연해야 합니다. 일괄 처리에 참여하려면 영속 저장소에 대해 보류 중인 변경 내용을 나타내는 작업 항목을 WorkBatch 속성에 추가하고 지속성 서비스에 IPendingWork 인터페이스를 구현합니다.

적용 대상