WorkflowPersistenceService.SaveWorkflowInstanceState Metoda
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Po zaimplementowaniu w klasie pochodnej zapisuje stan wystąpienia przepływu pracy w magazynie danych.
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)
Parametry
- rootActivity
- Activity
Działanie główne wystąpienia przepływu pracy.
- unlock
- Boolean
true
jeśli wystąpienie przepływu pracy nie powinno być zablokowane; false
jeśli wystąpienie przepływu pracy powinno być zablokowane.
Przykłady
W poniższym przykładzie pokazano implementację SaveWorkflowInstanceState
metody . Ten przykład pochodzi z przykładowej usługi Custom Persistence Service z pliku FilePersistenceService.cs. Aby uzyskać więcej informacji, zobacz Custom Persistence Service Sample (Przykład usługi 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
Uwagi
Aby serializować rootActivity
metodę, należy wywołać jedną z metod przeciążonych Save do klasy Stream. Następnie możesz dodatkowo przetworzyć element Stream przed zapisaniem go w magazynie danych. Jednak gdy aparat środowiska uruchomieniowego przepływu pracy wywołuje LoadWorkflowInstanceStatemetodę , należy przywrócić identyczną kopię działania głównego. Jeśli nie możesz zapisać stanu wystąpienia przepływu pracy w magazynie danych, należy zgłosić PersistenceException komunikat o błędzie z odpowiednim komunikatem o błędzie.
Aparat środowiska uruchomieniowego przepływu pracy zapewnia semantyka blokowania w celu ograniczenia dostępu do stanu wystąpienia przepływu pracy zapisanego w magazynie danych. Można do tego uzyskać dostęp za pomocą usług trwałości uruchomionych na wielu hostach i wskazujących ten sam magazyn danych. Semantyka blokowania została zaprojektowana tak, aby zapobiec jednoczesnemu ładowaniu tego samego wystąpienia przepływu pracy do pamięci w dwóch różnych środowiskach uruchomieniowych przepływu pracy. W zależności od typu środowiska, w którym usługa trwałości jest przeznaczona do obsługi, możesz wybrać, czy ta funkcja ma być obsługiwana. Jeśli zdecydujesz się na obsługę semantyki blokowania środowiska uruchomieniowego, jeśli usługa trwałości spróbuje zapisać stan wystąpienia przepływu pracy, który został wcześniej zablokowany przez inną usługę trwałości, należy zgłosić błąd WorkflowOwnershipException. Jeśli unlock
ma wartość true
, po zapisaniu należy odblokować dostęp do stanu wystąpienia przepływu pracy.
LoadWorkflowInstanceState Guid przyjmuje wystąpienie przepływu pracy jako parametr. W związku z tym należy zapisać ten plik Guid. Można go Guid również użyć do skojarzenia wystąpienia przepływu pracy z zapisanymi stanami jego ukończonych zakresów. Należy to zrobić, ponieważ musisz mieć możliwość oznaczania tych ukończonych zakresów jako niepotrzebnych po zakończeniu wystąpienia przepływu pracy.
Aparat środowiska uruchomieniowego przepływu pracy wywołuje SaveWorkflowInstanceState czas końcowy po zakończeniu lub zakończeniu wystąpienia przepływu pracy. W związku z tym, jeśli GetWorkflowStatus jest równe Completed lub Terminated, można bezpiecznie usunąć wystąpienie przepływu pracy i wszystkie skojarzone z nim zakresy z magazynu danych. Alternatywnie możesz zasubskrybować zdarzenia WorkflowCompleted lub WorkflowTerminated , aby określić, kiedy można bezpiecznie usunąć rekordy skojarzone z wystąpieniem przepływu pracy. Niezależnie od tego, czy faktycznie usuwasz rekordy z magazynu danych, zależy od implementacji.
Jeśli zaimplementujesz usługę trwałości, która używa trwałego magazynu, to aby zachować spójność ze stanem wewnętrznym aparatu środowiska uruchomieniowego przepływu pracy, należy wziąć udział w przetwarzaniu partii transakcji przepływu pracy w celu odroczenia rzeczywistego zapisu w magazynie trwałym do momentu punktu zatwierdzania przepływu pracy. Aby uczestniczyć w przetwarzaniu wsadowym, dodaj element roboczy reprezentujący oczekujące zmiany w magazynie trwałym WorkBatch do właściwości i zaimplementuj IPendingWork interfejs w usłudze trwałości.