Sdílet prostřednictvím


Neudržované instance pracovního postupu

Když se vytvoří nová instance pracovního postupu, která uchovává její stav v SqlWorkflowInstanceStoreúložišti instancí, hostitel služby vytvoří položku pro tuto službu v úložišti instancí. Následně, když je instance pracovního postupu uložena poprvé, SqlWorkflowInstanceStore uloží aktuální stav instance. Pokud je pracovní postup hostovaný ve službě aktivace procesu systému Windows, data nasazení služby se také zapisují do úložiště instancí při prvním uložení instance.

Pokud instance pracovního postupu nebyla zachována, je v neudrženém stavu. V tomto stavu nelze instanci pracovního postupu obnovit po recyklaci domény aplikace, selhání hostitele nebo selhání počítače.

Nestálý stav

Trvalé instance pracovního postupu, které nebyly persistovány, zůstávají v nepersistovaném stavu v následujících případech:

  • Hostitel služby se zhroutí, než je instance pracovního postupu poprvé uložena. Instance pracovního postupu zůstává v úložišti instancí a není obnovena. Pokud dorazí korelovaná zpráva, instance pracovního postupu se znovu aktivuje.

  • Instance pracovního postupu zaznamená výjimku předtím, než se poprvé zachová. V závislosti na vráceném UnhandledExceptionAction dochází k následujícím scénářům:

    • UnhandledExceptionAction je nastavena na Abort: Pokud dojde k výjimce, informace o nasazení služby se zapisují do úložiště instancí a instance pracovního postupu se uvolní z paměti. Instance pracovního postupu zůstává v neuloženém stavu a nelze ji znovu načíst.

    • UnhandledExceptionAction je nastavena na Cancel hodnotu nebo Terminate: Pokud dojde k výjimce, informace o nasazení služby se zapíšou do úložiště instancí a stav instance aktivity je nastaven na Closedhodnotu .

Pokud chcete minimalizovat riziko, že dojde k nenačteným ne trvalým instancím pracovního postupu, doporučujeme pracovní postup zachovat v rané fázi jeho životního cyklu.

Detekce a odebrání nezachovaných instancí

Neodebere SqlWorkflowInstanceStore žádné instance pracovních postupů, které nejsou trvalé, z úložiště instancí. Neodebere také žádné vlastníky zámků s vypršenou platností, kteří mají asociované neperzistentní instance pracovního postupu.

Doporučujeme, aby správce pravidelně kontroloval úložiště pro dočasně uložené instance. Správci mohou tyto instance z úložiště instancí odebrat, pokud vědí, že tento pracovní postup nebude přijímat korelované zprávy. Pokud je například instance v databázi několik měsíců a je známo, že pracovní postup má obvykle životnost několika dnů, je bezpečné předpokládat, že se jedná o inicializovanou instanci, která havarovala.

Pokud chcete najít nezachované instance v úložišti instancí pracovního postupu SQL, můžete použít následující dotazy SQL:

  • Tento dotaz vyhledá všechny instance, které nebyly zachovány, a vrátí id a čas vytvoření (uložený v čase UTC).

    select InstanceId, CreationTime
        from [System.Activities.DurableInstancing].[Instances]
        where IsInitialized = 0
    
  • Tento dotaz vyhledá všechny instance, které nebyly zachovány a které nejsou načteny, a vrátí pro ně ID a čas vytvoření (uložený v čase UTC).

    select InstanceId, CreationTime
        from [System.Activities.DurableInstancing].[Instances]
        where IsInitialized = 0
            and CurrentMachine is NULL
    
  • Tento dotaz najde všechny pozastavené instance, které nebyly zachovány, a vrátí ID, čas vytvoření (uložený v čase UTC), důvod pozastavení a název výjimky.

    select InstanceId, CreationTime, SuspensionReason, SuspensionExceptionName
        from [System.Activities.DurableInstancing].[Instances]
        where IsInitialized = 0
            and IsSuspended = 1
    

Při odstraňování nepřetrvávajících instancí buďte opatrní. Obecně platí, že je bezpečné odebrat neuchované instance vytvořené WorkflowServiceHost , které jsou pozastavené nebo nejsou načteny. Tyto konkrétní instance je možné odstranit z úložiště odstraněním ze [System.Activities.DurableInstancing].[Instances] zobrazení pomocí následujícího příkazu SQL a nahrazením správného ID instance.

delete [System.Activities.DurableInstancing].[Instances]
    where InstanceId=’078a9bc4-ada5-4f9e-8cce-b0eb0009995f’

Výstraha

Nedoporučujeme odebírat všechny neuchované instance, protože to zahrnuje instance, které byly právě vytvořeny a dosud nebyly zachovány.