Delen via


Volhardingsdeelnemers

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 persistentie-deelnemer is afgeleid van een van deze klassen, implementeert de betreffende methoden en voegt vervolgens een exemplaar van de klasse toe aan de WorkflowExtensions collectie op de WorkflowServiceHost. 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.

  1. Verzamelt ingebouwde waarden, waaronder werkstroomstatus, bladwijzers, toegewezen variabelen en tijdstempel.

  2. Verzamelt alle persistentiedeelnemers die zijn toegevoegd aan de extensieverzameling die is gekoppeld aan het werkstroomexemplaar.

  3. Roept de CollectValues methode aan die is geïmplementeerd door alle persistentiedeelnemers.

  4. Roept de MapValues methode aan die is geïmplementeerd door alle persistentiedeelnemers.

  5. De werkstroom behouden of opslaan in het persistentiearchief.

  6. 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 persistentie-episode transactioneel is, wordt de transactie opgegeven in de Property Transaction.Current.

  7. Wacht tot alle persistentiedeelnemers zijn voltooid. Indien alle deelnemers erin slagen om exemplaargegevens te persisteren, wordt de transactie uitgevoerd.

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 zijn verzameld, aan alle deelnemers van de persistentie verstrekt in de tweede fase voor mapping. Vervolgens worden alle waarden die in de eerste en tweede fasen zijn verzameld en in kaart gebracht, in de derde fase aan de persistentie service verstrekt, 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.

  1. Verzamelt alle persistentiedeelnemers die zijn toegevoegd aan de extensieverzameling die is gekoppeld aan het werkstroomexemplaar.

  2. Laadt de werkstroom uit de persistentieopslag.

  3. Activeert de BeginOnLoad voor alle I/O-deelnemers met betrekking tot persistentie en wacht tot alle persistentiedeelnemers hun taak hebben voltooid. Als de persistentie-episode transactioneel is, wordt de transactie aangeboden in Transaction.Current.

  4. Laadt de werkstroominstantie in geheugen op basis van de gegevens die zijn opgehaald uit de persistentieopslag.

  5. Activeert PublishValues voor elke persistentie-deelnemer.

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 werkstroomexemplaar maakt de provider voor persistentie een slot op dat exemplaar. Dit voorkomt dat de instantie wordt geladen door meer dan één host in een meerknooppuntenscenario. Als u probeert een werkstroomexemplaar te laden dat is vergrendeld, krijgt u een uitzondering te zien zoals de volgende: "De uitzondering 'System.ServiceModel.Persistence.InstanceLockException: De aangevraagde bewerking kan niet worden voltooid omdat de vergrendeling voor het exemplaar '00000000-0000-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 een paar verschillende manieren om dit soort conflicten op te lossen: stuur de verwerking naar het knooppunt dat de vergrendeling bezit en probeer het opnieuw, of dwing de handeling af waardoor de andere host hun werk niet kan opslaan.

  • In een scenario met één knooppunt is de host gecrasht. Wanneer de host opnieuw wordt opgestart (bij het recyclen van een proces of het creëren van een nieuwe persistentieproviderfabriek) probeert de nieuwe host een exemplaar te laden dat nog steeds door de oude host vergrendeld is, omdat het slot nog niet verlopen is.

  • In een scenario met één knooppunt en het besproken exemplaar is op enig moment beëindigd, 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.

In deze sectie

Zie ook