WorkflowPersistenceService.SaveWorkflowInstanceState 메서드
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
파생 클래스에서 구현되는 경우 워크플로 인스턴스 상태를 데이터 저장소에 저장합니다.
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 메서드 중 하나를 호출하여 rootActivity
를 Stream으로 serialize해야 합니다. 데이터 저장소에 쓰기 전에 Stream을 추가로 처리하도록 선택할 수 있습니다. 그러나 워크플로 런타임 엔진이 LoadWorkflowInstanceState를 호출할 때 루트 활동의 동일한 복사본을 복원해야 합니다. 워크플로 인스턴스 상태를 데이터 저장소에 저장할 수 없는 경우 해당 오류 메시지와 함께 PersistenceException을 throw해야 합니다.
워크플로 런타임 엔진은 잠금 의미 체계를 제공하여 데이터 저장소에 저장된 워크플로 인스턴스 상태에 대한 액세스를 제한합니다. 워크플로 인스턴스 상태는 호스트에서 실행되고 동일한 데이터 저장소를 가리키는 지속성 서비스로 액세스할 수 있습니다. 잠금 의미 체계는 두 개의 다른 워크플로 런타임에서 실행되는 지속성 서비스가 동일한 워크플로 인스턴스를 동시에 메모리에 로드할 수 없도록 디자인되었습니다. 지속성 서비스가 지원하도록 디자인된 환경 유형에 따라 이 기능의 지원 여부를 선택할 수 있습니다. 런타임 잠금 의미 체계를 지원하도록 선택하면 지속성 서비스가 이전에 다른 지속성 서비스에서 잠긴 워크플로 인스턴스 상태를 저장하려고 시도하는 경우 WorkflowOwnershipException을 throw해야 합니다.
unlock
이 true
이면 저장 후 워크플로 인스턴스 상태에 대한 액세스를 잠금 해제해야 합니다.
LoadWorkflowInstanceState는 워크플로 인스턴스의 Guid를 매개 변수로 사용합니다. 따라서 이 Guid를 저장해야 합니다. 이 Guid를 사용하여 워크플로 인스턴스를 완료된 범위의 저장된 상태와 연결할 수도 있습니다. 워크플로 인스턴스가 완료될 때 완료된 범위를 필요하지 않은 것으로 표시할 수 있으려면 이 작업을 수행해야 합니다.
워크플로 런타임 엔진은 워크플로 인스턴스가 최종적으로 완료되거나 종료될 때 SaveWorkflowInstanceState를 호출합니다. 따라서 GetWorkflowStatus가 Completed 또는 Terminated와 같으면 워크플로 인스턴스 및 연결된 모든 완료된 범위를 데이터 저장소에서 안전하게 삭제할 수 있습니다. 또는 WorkflowCompleted 또는 WorkflowTerminated 이벤트를 구독하여 워크플로 인스턴스와 연결된 레코드를 안전하게 삭제할 수 있는 시기를 확인할 수 있습니다. 실제로 데이터 저장소에서 레코드를 삭제할지 여부는 구현에 따라 달라집니다.
영속 저장소를 사용하는 지속성 서비스를 구현하는 경우 워크플로 런타임 엔진의 내부 상태와 일관성을 유지하려면 워크플로 트랜잭션 일괄 처리에 참여하여 영속 저장소에 대한 실제 쓰기를 워크플로 커밋 점까지 지연해야 합니다. 일괄 처리에 참여하려면 영속 저장소에 대해 보류 중인 변경 내용을 나타내는 작업 항목을 WorkBatch 속성에 추가하고 지속성 서비스에 IPendingWork 인터페이스를 구현합니다.
적용 대상
.NET