Persistentiedeelnemers
Een persistentiedeelnemer kan deelnemen aan een persistentiebewerking (Opslaan of Laden) die wordt geactiveerd door een toepassingshost. Het .NET Framework 4.6.1 wordt geleverd met twee abstracte klassen PersistenceParticipant en PersistenceIOParticipant, die u kunt gebruiken om een persistentiedeelnemer te maken. Een persistentiedeelnemer is afgeleid van een van deze klassen, implementeert de interessante methoden en voegt vervolgens een exemplaar van de klasse toe aan de WorkflowExtensions verzameling op de WorkflowServiceHost verzameling. De toepassingshost kan zoeken naar dergelijke werkstroomextensies bij het persistent maken van een werkstroomexemplaren en de juiste methoden aanroepen voor de persistentiedeelnemers op de juiste momenten.
In de volgende lijst worden de taken beschreven die worden uitgevoerd door het persistentiesubsysteem in verschillende fasen van de bewerking Persistent (Opslaan). De persistentiedeelnemers worden gebruikt in de derde en vierde fase. Als de deelnemer een I/O-deelnemer is (een persistentie deelnemer die ook deelneemt aan I/O-activiteiten), wordt de deelnemer ook gebruikt in de zesde fase.
Verzamelt ingebouwde waarden, waaronder werkstroomstatus, bladwijzers, toegewezen variabelen en tijdstempel.
Verzamelt alle persistentiedeelnemers die zijn toegevoegd aan de extensieverzameling die is gekoppeld aan het werkstroomexemplaar.
Roept de CollectValues methode aan die is geïmplementeerd door alle persistentiedeelnemers.
Roept de MapValues methode aan die is geïmplementeerd door alle persistentiedeelnemers.
De werkstroom behouden of opslaan in het persistentiearchief.
Roept de BeginOnSave methode aan voor alle persistentie-I/O-deelnemers. Als de deelnemer geen I/O-deelnemer is, wordt deze taak overgeslagen. Als de aflevering van persistentie transactioneel is, wordt de transactie opgegeven in de eigenschap Transaction.Current.
Wacht tot alle persistentiedeelnemers zijn voltooid. Als alle deelnemers geslaagd zijn in het persistent maken van exemplaargegevens, voert u de transactie door.
Een persistentiedeelnemer is afgeleid van de klasse PersistenceParticipant en kan de methoden CollectValues en MapValues implementeren. Een I/O-deelnemer voor persistentie is afgeleid van de klasse PersistenceIOParticipant en kan de Methode BeginOnSave implementeren naast het implementeren van de methoden CollectValues en MapValues .
Elke fase wordt voltooid voordat de volgende fase begint. Waarden worden bijvoorbeeld verzameld van alle persistentiedeelnemers in de eerste fase. Vervolgens worden alle waarden die in de eerste fase worden verzameld, verstrekt aan alle persistentiedeelnemers in de tweede fase voor toewijzing. Vervolgens worden alle waarden die in de eerste en tweede fasen zijn verzameld en toegewezen aan de persistentieprovider in de derde fase, enzovoort.
In de volgende lijst worden de taken beschreven die door het persistentiesubsysteem worden uitgevoerd in verschillende fasen van de bewerking Laden. De persistentiedeelnemers worden gebruikt in de vierde fase. De persistentie-I/O-deelnemers (persistentiedeelnemers die ook deelnemen aan I/O-bewerkingen) worden ook gebruikt in de derde fase.
Verzamelt alle persistentiedeelnemers die zijn toegevoegd aan de extensieverzameling die is gekoppeld aan het werkstroomexemplaar.
Laadt de werkstroom uit het persistentiearchief.
Roept de BeginOnLoad I/O-deelnemers voor alle persistentie aan en wacht tot alle persistentiedeelnemers zijn voltooid. Als de aflevering van persistentie transactioneel is, wordt de transactie verstrekt in Transaction.Current.
Laadt het werkstroomexemplaren in het geheugen op basis van de gegevens die zijn opgehaald uit het persistentiearchief.
Roept aan op elke persistentiedeelnemer PublishValues .
Een persistentiedeelnemer is afgeleid van de klasse PersistenceParticipant en kan de methode PublishValues implementeren. Een I/O-deelnemer voor persistentie is afgeleid van de klasse PersistenceIOParticipant en kan de Methode BeginOnLoad naast het implementeren van de methode PublishValues implementeren.
Bij het laden van een werkstroomexemplaren maakt de persistentieprovider een vergrendeling op dat exemplaar. Dit voorkomt dat het exemplaar wordt geladen door meer dan één host in een scenario met meerdere knooppunten. Als u probeert een werkstroomexemplaren te laden die is vergrendeld, ziet u een uitzondering zoals hieronder: De uitzondering System.ServiceModel.Persistence.InstanceLockException: de aangevraagde bewerking kan niet worden voltooid omdat de vergrendeling voor het exemplaar 000000000-0000-0000-000000000000 niet kan worden verkregen". Deze fout wordt veroorzaakt wanneer een van de volgende situaties optreedt:
In een scenario met meerdere knooppunten wordt het exemplaar geladen door een andere host. Er zijn verschillende manieren om deze soorten conflicten op te lossen: stuur de verwerking door naar het knooppunt dat eigenaar is van de vergrendeling en probeer het opnieuw, of forceer de belasting waardoor de andere host hun werk niet kan opslaan.
In een scenario met één knooppunt en de host is vastgelopen. Wanneer de host opnieuw wordt opgestart (een procesresource of het maken van een nieuwe persistentieproviderfactory) probeert de nieuwe host een exemplaar te laden dat nog steeds is vergrendeld door de oude host omdat de vergrendeling nog niet is verlopen.
In een scenario met één knooppunt en het betreffende exemplaar is op een bepaald moment afgebroken en wordt er een nieuw exemplaar van de persistentieprovider gemaakt met een andere host-id.
De time-outwaarde voor vergrendeling heeft een standaardwaarde van 5 minuten. U kunt een andere time-outwaarde opgeven bij het aanroepen Load.