Dela via


Instanser av icke-beständiga arbetsflöden

När en ny instans av ett arbetsflöde skapas som bevarar dess tillstånd i SqlWorkflowInstanceStoreskapar tjänstvärden en post för tjänsten i instansarkivet. När arbetsflödesinstansen sparas för första gången lagrar därefter det aktuella instanstillståndet SqlWorkflowInstanceStore . Om arbetsflödet finns i Windows Process Activation Service skrivs även tjänstdistributionsdata till instansarkivet när instansen sparas för första gången.

Så länge arbetsflödesinstansen inte har sparats är den i ett icke-beständiga tillstånd. I det här tillståndet kan arbetsflödesinstansen inte återställas efter ett programdomänåtervinnelse, värdfel eller datorfel.

Det icke-bevarade tillståndet

Instanser av varaktiga arbetsflöden som inte har sparats förblir i ett icke-beständiga tillstånd i följande fall:

  • Tjänstvärden kraschar innan arbetsflödesinstansen sparas för första gången. Arbetsflödesinstansen finns kvar i instansarkivet och återställs inte. Om ett korrelerat meddelande kommer blir arbetsflödesinstansen aktiv igen.

  • Arbetsflödesinstansen får ett undantag innan den sparas för första gången. Beroende på vilka UnhandledExceptionAction som returneras inträffar följande scenarier:

    • UnhandledExceptionAction är inställt på Abort: När ett undantag inträffar skrivs information om tjänstdistribution till instansarkivet och arbetsflödesinstansen tas bort från minnet. Arbetsflödesinstansen förblir i ett icke-beständiga tillstånd och kan inte läsas in igen.

    • UnhandledExceptionAction är inställt på Cancel eller Terminate: När ett undantag inträffar skrivs information om tjänstdistributionen till instansarkivet och aktivitetsinstansens tillstånd är inställt på Closed.

För att minimera risken för att påträffa oaktiverade instanser av icke-beständiga arbetsflöden rekommenderar vi att du bevarar arbetsflödet tidigt i livscykeln.

Identifiering och borttagning av icke-bevarade instanser

SqlWorkflowInstanceStore Tar inte bort några instanser av icke-beständiga arbetsflöden från instansarkivet. Den tar inte heller bort några utgångna låsägare som har icke-bevarade arbetsflödesinstanser som är associerade med dem.

Vi rekommenderar att administratören regelbundet kontrollerar instansarkivet efter icke-bevarade instanser. Administratörer kan ta bort dessa instanser från instansarkivet så länge de vet att arbetsflödet inte tar emot korrelerade meddelanden. Om instansen till exempel har funnits i databasen i flera månader och det är känt att arbetsflödet vanligtvis har en livslängd på flera dagar, är det säkert att anta att detta var en initierad instans som hade kraschat.

Om du vill hitta icke-bevarade instanser i SQL Workflow Instance Store kan du använda följande SQL-frågor:

  • Den här frågan hittar alla instanser som inte har sparats och returnerar ID och skapandetid (lagras i UTC-tid) för dem.

    select InstanceId, CreationTime
        from [System.Activities.DurableInstancing].[Instances]
        where IsInitialized = 0
    
  • Den här frågan hittar alla instanser som inte har sparats och som inte läses in och returnerar ID och skapandetid (lagras i UTC-tid) för dem.

    select InstanceId, CreationTime
        from [System.Activities.DurableInstancing].[Instances]
        where IsInitialized = 0
            and CurrentMachine is NULL
    
  • Den här frågan hittar alla pausade instanser som inte har sparats och returnerar ID, skapandetid (lagras i UTC-tid), avstängningsorsak och undantagsnamn för dem.

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

Var försiktig när du tar bort icke-bevarade instanser. I allmänhet är det säkert att ta bort icke-bevarade instanser som skapats av WorkflowServiceHost som är pausade eller inte läses in. Dessa specifika instanser kan tas bort från arkivet genom att ta bort dem från [System.Activities.DurableInstancing].[Instances] vyn med hjälp av följande SQL-kommando och ersätta rätt instans-ID.

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

Varning

Vi rekommenderar inte att du tar bort alla icke-bevarade instanser eftersom detta inkluderar instanser som just har skapats och ännu inte har sparats.