Megosztás a következőn keresztül:


Kitartó résztvevők

A perzisztencia résztvevői részt vehetnek egy alkalmazásgazda által aktivált adatmegőrzési műveletben (Mentés vagy Betöltés). A .NET-keretrendszer 4.6.1-es verziója két absztrakt osztálysal rendelkezik, a PersistenceParticipant és a PersistenceIOParticipant osztályokkal, amelyekkel egy adatmegőrzési résztvevőt hozhat létre. A perzisztens résztvevő ezen osztályok egyikéből származik, megvalósítja a szükséges módszereket, majd hozzáadja az osztály egy példányát a WorkflowExtensions gyűjteményhez a WorkflowServiceHost . Az alkalmazásgazda megkeresheti az ilyen munkafolyamat-bővítményeket a munkafolyamat-példányok megőrzésekor, és megfelelő metódusokat hívhat meg a perzisztencia résztvevőin a megfelelő időpontokban.

Az alábbi lista azokat a feladatokat ismerteti, amelyeket az adatmegőrzési alrendszer a Perzisztencia (Mentés) művelet különböző szakaszaiban hajt végre. A perzisztencia résztvevőit a harmadik és a negyedik szakaszban használják. Ha a résztvevő I/O-résztvevő (az I/O-műveletekben is részt vevő adatmegőrzési résztvevő), a résztvevőt a hatodik szakaszban is használja a rendszer.

  1. Beépített értékeket gyűjt, beleértve a munkafolyamat állapotát, a könyvjelzőket, a megfeleltetett változókat és az időbélyeget.

  2. Összegyűjti a munkafolyamat-példányhoz társított bővítménygyűjteményhez hozzáadott összes adatmegőrzési résztvevőt.

  3. Meghívja az CollectValues összes adatmegőrzési résztvevő által implementált metódust.

  4. Meghívja az MapValues összes adatmegőrzési résztvevő által implementált metódust.

  5. A munkafolyamat megőrzése vagy mentése a tartós tárhelyre.

  6. Meghívja a BeginOnSave metódust az összes tárolási I/O-résztvevőn. Ha a résztvevő nem I/O-résztvevő, a program kihagyja ezt a feladatot. Ha az adatmegőrzési epizód tranzakciós, a tranzakció a Transaction.Current tulajdonságban lesz megadva.

  7. Megvárja, amíg az összes perzisztenciát biztosító résztvevő befejezi. Ha az összes résztvevő sikeresen megőrzi a példányadatokat, véglegesíti a tranzakciót.

A perzisztencia résztvevői a PersistenceParticipant osztályból származnak, és implementálhatják a CollectValues és a MapValues metódusokat . A perzisztencia I/O-résztvevő a PersistenceIOParticipant osztályból származik, és a CollectValues és a MapValues metódus implementálása mellett implementálhatja a BeginOnSave metódust is.

Minden szakasz befejeződik a következő szakasz kezdete előtt. Az értékeket például az első szakasz összes adatmegőrzési résztvevője gyűjti. Ezután az első szakaszban összegyűjtött összes érték meg lesz adva a második szakasz összes adatmegőrzési résztvevőjének a leképezéshez. Ezután az első és a második fázisban összegyűjtött és leképezett összes érték a harmadik szakaszban található adatmegőrzési szolgáltatónak lesz megadva, és így tovább.

Az alábbi lista a terhelési művelet különböző szakaszaiban az adatmegőrzési alrendszer által végrehajtott feladatokat ismerteti. Az kitartó résztvevőket a negyedik szakaszban használjuk. A harmadik szakaszban a perzisztencia I/O-résztvevőit (az I/O-műveletekben szintén részt vevő adatmegőrzési résztvevőket) is használják.

  1. Összegyűjti a munkafolyamat-példányhoz társított bővítménygyűjteményhez hozzáadott összes adatmegőrzési résztvevőt.

  2. Betölti a munkafolyamatot az adatbázisból.

  3. Meghívja a BeginOnLoad az összes tartóssági I/O-résztvevőt, és megvárja, amíg az összes tartóssági résztvevő feladata befejeződik. Ha a perzisztencia epizód tranzakciós, a tranzakció a Transaction.Current fájlban lesz megadva.

  4. Betölti a munkafolyamat-példányt a memóriába a perzisztens tárból lekért adatok alapján.

  5. Minden adatmegőrzési résztvevőn meghívja a PublishValues-t.

A perzisztencia résztvevője a PersistenceParticipant osztályból származik, és implementálhatja a PublishValues metódust . A perzisztencia I/O-résztvevője a PersistenceIOParticipant osztályból származik, és a PublishValues metódus implementálása mellett implementálhatja a BeginOnLoad metódust is.

Munkafolyamat-példány betöltésekor a adatmegőrzési szolgáltató zárolást hoz létre az adott példányon. Ez megakadályozza, hogy a példányt több gazdagép töltse be egy többcsomópontos környezetben. Ha zárolt munkafolyamat-példányt próbál betölteni, a következőhöz hasonló kivétel jelenik meg: "System.ServiceModel.Persistence.InstanceLockException: A kért művelet nem fejezhető be, mert a(z) "0000000-0000-0000-0000-0000-00000-000000000000" példány zárolását nem sikerült beszerezni". Ez a hiba az alábbi esetekben jelentkezik:

  • Többcsomópontos forgatókönyv esetén a példányt egy másik gazdagép tölti be. Az ilyen típusú ütközések megoldásának többféle módja is van: továbbíthatja a feldolgozást a zárolást és az újrapróbálkozást birtokelő csomópontnak, vagy kényszerítheti a terhelést, amely miatt a másik gazdagép nem tudja menteni a munkáját.

  • Egy egycsomópontos forgatókönyvben a gazdagép összeomlott. Amikor a gazdagép újra elindul (folyamat-újrafeldolgozás vagy új adatmegőrzési szolgáltató-előállító létrehozása), az új gazdagép megpróbál betölteni egy példányt, amelyet a régi gazdagép zárol, mert a zárolás még nem járt le.

  • Egy egycsomópontos forgatókönyvben a szóban forgó példány egy ponton megszakadt, és létrejön egy új állandó tárhely szolgáltató példány, amely más házigép-azonosítóval rendelkezik.

A zárolási időtúllépési érték alapértelmezett értéke 5 perc, híváskor Loadmásik időtúllépési értéket adhat meg.

Ebben a részben

Lásd még