Uczestnicy stanów trwałych
Uczestnik trwałości może uczestniczyć w operacji trwałości (zapisz lub załaduj) wyzwalanej przez hosta aplikacji. Program .NET Framework 4.6.1 jest dostarczany z dwiema klasami abstrakcyjnymi, PersistenceParticipant i PersistenceIOParticipant, których można użyć do utworzenia uczestnika trwałości. Uczestnik trwałości pochodzi z jednej z tych klas, implementuje metody zainteresowania, a następnie dodaje wystąpienie klasy do WorkflowExtensions kolekcji w WorkflowServiceHost obiekcie . Host aplikacji może szukać takich rozszerzeń przepływu pracy podczas utrwalania wystąpienia przepływu pracy i wywoływać odpowiednie metody dla uczestników trwałości w odpowiednim czasie.
Poniższa lista zawiera opis zadań wykonywanych przez podsystem trwałości na różnych etapach operacji Utrwalanie (Zapisywanie). Uczestnicy trwałości są przyzwyczajeni do trzeciego i czwartego etapu. Jeśli uczestnik jest uczestnikiem operacji we/wy (uczestnikiem trwałości, który również uczestniczy w operacjach we/wy), uczestnik jest również używany w szóstym etapie.
Zbiera wbudowane wartości, w tym stan przepływu pracy, zakładki, zamapowane zmienne i sygnaturę czasową.
Zbiera wszystkich uczestników trwałości, którzy zostali dodani do kolekcji rozszerzeń skojarzonej z wystąpieniem przepływu pracy.
Wywołuje metodę CollectValues zaimplementowaną przez wszystkich uczestników trwałości.
Wywołuje metodę MapValues zaimplementowaną przez wszystkich uczestników trwałości.
Utrwalanie lub zapisywanie przepływu pracy w magazynie trwałości.
Wywołuje metodę BeginOnSave dla wszystkich uczestników we/wy trwałości. Jeśli uczestnik nie jest uczestnikiem we/wy, to zadanie zostanie pominięte. Jeśli odcinek trwałości jest transakcyjny, transakcja jest podana we właściwości Transaction.Current.
Czeka na ukończenie wszystkich uczestników trwałości. Jeśli wszyscy uczestnicy kończą się powodzeniem w utrwalaniu danych wystąpienia, zatwierdza transakcję.
Uczestnik trwałości pochodzi z klasy PersistenceParticipant i może implementować metody CollectValues i MapValues . Uczestnik we/wy trwałości pochodzi z klasy PersistenceIOParticipant i może zaimplementować metodę BeginOnSave oprócz implementacji metod CollectValues i MapValues .
Każdy etap zostanie ukończony przed rozpoczęciem następnego etapu. Na przykład wartości są zbierane ze wszystkich uczestników trwałości w pierwszym etapie. Następnie wszystkie wartości zebrane w pierwszym etapie są udostępniane wszystkim uczestnikom trwałości w drugim etapie mapowania. Następnie wszystkie wartości zebrane i zamapowane w pierwszym i drugim etapie są udostępniane dostawcy trwałości w trzecim etapie itd.
Poniższa lista zawiera opis zadań wykonywanych przez podsystem trwałości na różnych etapach operacji ładowania. Uczestnicy trwałości są przyzwyczajeni do czwartego etapu. Uczestnicy we/wy trwałości (uczestnicy trwałości, którzy również uczestniczą w operacjach we/wy) są również używane na trzecim etapie.
Zbiera wszystkich uczestników trwałości, którzy zostali dodani do kolekcji rozszerzeń skojarzonej z wystąpieniem przepływu pracy.
Ładuje przepływ pracy z magazynu trwałości.
Wywołuje wszystkich uczestników we/wy BeginOnLoad trwałości i czeka na ukończenie wszystkich uczestników trwałości. Jeśli odcinek trwałości jest transakcyjny, transakcja jest podana w transaction.Current.
Ładuje wystąpienie przepływu pracy w pamięci na podstawie danych pobranych z magazynu trwałości.
PublishValues Wywołuje dla każdego uczestnika trwałości.
Uczestnik trwałości pochodzi z klasy PersistenceParticipant i może zaimplementować metodę PublishValues . Uczestnik we/wy trwałości pochodzi z klasy PersistenceIOParticipant i może zaimplementować metodę BeginOnLoad oprócz implementacji metody PublishValues .
Podczas ładowania wystąpienia przepływu pracy dostawca trwałości tworzy blokadę dla tego wystąpienia. Zapobiega to ładowaniu wystąpienia przez więcej niż jednego hosta w scenariuszu z wieloma węzłami. Jeśli spróbujesz załadować wystąpienie przepływu pracy, które zostało zablokowane, zostanie wyświetlony wyjątek podobny do następującego: Wyjątek " System.ServiceModel.Persistence.InstanceLockException: Żądana operacja nie może zostać ukończona, ponieważ nie można uzyskać blokady dla wystąpienia "0000000000000-0000-0000-00000000000". Ten błąd jest spowodowany, gdy wystąpi jeden z następujących:
W scenariuszu z wieloma węzłami wystąpienie jest ładowane przez innego hosta. Istnieje kilka różnych sposobów rozwiązywania tego typu konfliktów: przekazywanie przetwarzania do węzła będącego właścicielem blokady i ponawiania próby lub wymuszanie obciążenia, co spowoduje, że inny host nie będzie mógł zapisać pracy.
W scenariuszu z jednym węzłem i host uległ awarii. Po ponownym uruchomieniu hosta (recyklingu procesu lub utworzeniu nowej fabryki dostawcy trwałości) nowy host próbuje załadować wystąpienie, które jest nadal zablokowane przez starego hosta, ponieważ blokada nie wygasła jeszcze.
W scenariuszu z jednym węzłem i wystąpienie, o którym mowa, zostało przerwane w pewnym momencie, a tworzone jest nowe wystąpienie dostawcy trwałości, które ma inny identyfikator hosta.
Wartość limitu czasu blokady ma wartość domyślną 5 minut. Podczas wywoływania Loadfunkcji można określić inną wartość limitu czasu.