Udostępnij za pośrednictwem


Nietrwałe wystąpienia przepływu pracy

Po utworzeniu nowego wystąpienia przepływu pracy, które utrwala jego stan w SqlWorkflowInstanceStoreobiekcie , host usługi tworzy wpis dla tej usługi w magazynie wystąpień. Następnie, gdy wystąpienie przepływu pracy jest utrwalane po raz pierwszy, SqlWorkflowInstanceStore przechowuje bieżący stan wystąpienia. Jeśli przepływ pracy jest hostowany w usłudze aktywacji procesów systemu Windows, dane wdrożenia usługi są również zapisywane w magazynie wystąpień, gdy wystąpienie jest utrwalane po raz pierwszy.

Jeśli wystąpienie przepływu pracy nie zostało utrwalone, jest w stanie nietrwałym. W tym stanie nie można odzyskać wystąpienia przepływu pracy po odtworzeniu domeny aplikacji, awarii hosta lub awarii komputera.

Stan nietrwały

Trwałe wystąpienia przepływu pracy, które nie zostały utrwalone, pozostają w stanie nietrwałym w następujących przypadkach:

  • Host usługi ulega awarii, zanim wystąpienie przepływu pracy zostanie utrwalone po raz pierwszy. Wystąpienie przepływu pracy pozostaje w magazynie wystąpień i nie zostanie odzyskane. Jeśli zostanie wyświetlony skorelowany komunikat, wystąpienie przepływu pracy ponownie stanie się aktywne.

  • Wystąpienie przepływu pracy napotka wyjątek, zanim zostanie utrwalone po raz pierwszy. W zależności od zwróconego UnhandledExceptionAction scenariusza występują następujące scenariusze:

    • UnhandledExceptionAction jest ustawiona na Abortwartość : Gdy wystąpi wyjątek, informacje o wdrożeniu usługi są zapisywane w magazynie wystąpień, a wystąpienie przepływu pracy jest zwalniane z pamięci. Wystąpienie przepływu pracy pozostaje w stanie nietrwałym i nie można go ponownie załadować.

    • UnhandledExceptionAction jest ustawiona na Cancel wartość lub Terminate: W przypadku wystąpienia wyjątku informacje o wdrożeniu usługi są zapisywane w magazynie wystąpień, a stan wystąpienia działania ma wartość Closed.

Aby zminimalizować ryzyko napotkania nietrwałych nietrwałych wystąpień przepływu pracy, zalecamy utrwalanie przepływu pracy na wczesnym etapie jego cyklu życia.

Wykrywanie i usuwanie nietrwałych wystąpień

Obiekt SqlWorkflowInstanceStore nie usuwa żadnych nietrwałych wystąpień przepływu pracy z magazynu wystąpień. Nie usuwa również żadnych wygasłych właścicieli blokad, którzy mają skojarzone z nimi nietrwałe wystąpienia przepływu pracy.

Zalecamy, aby administrator okresowo sprawdza magazyn wystąpień dla nietrwałych wystąpień. Administracja istratory mogą usuwać te wystąpienia z magazynu wystąpień, o ile wiedzą, że ten przepływ pracy nie będzie otrzymywać skorelowanych komunikatów. Jeśli na przykład wystąpienie znajduje się w bazie danych przez kilka miesięcy i wiadomo, że przepływ pracy zwykle ma okres istnienia kilku dni, można bezpiecznie założyć, że było to zainicjowane wystąpienie, które uległo awarii.

Aby znaleźć wystąpienia nietrwałe w magazynie wystąpień przepływu pracy SQL, możesz użyć następujących zapytań SQL:

  • To zapytanie znajduje wszystkie wystąpienia, które nie zostały utrwalone, i zwraca identyfikator i czas tworzenia (przechowywany w czasie UTC) dla nich.

    select InstanceId, CreationTime
        from [System.Activities.DurableInstancing].[Instances]
        where IsInitialized = 0
    
  • To zapytanie znajduje wszystkie wystąpienia, które nie zostały utrwalone i które nie zostały załadowane, i zwraca identyfikator i czas tworzenia (przechowywany w czasie UTC) dla nich.

    select InstanceId, CreationTime
        from [System.Activities.DurableInstancing].[Instances]
        where IsInitialized = 0
            and CurrentMachine is NULL
    
  • To zapytanie znajduje wszystkie wstrzymane wystąpienia, które nie zostały utrwalone, i zwraca identyfikator, czas tworzenia (przechowywany w czasie UTC), przyczynę zawieszenia i nazwę wyjątku dla nich.

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

Należy zachować ostrożność podczas usuwania nietrwałych wystąpień. Ogólnie rzecz biorąc, bezpieczne jest usunięcie nietrwałych wystąpień utworzonych przez WorkflowServiceHost te, które są zawieszone lub nie są ładowane. Te konkretne wystąpienia można usunąć z magazynu, usuwając je z [System.Activities.DurableInstancing].[Instances] widoku przy użyciu następującego polecenia SQL, zastępując prawidłowy identyfikator wystąpienia.

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

Ostrzeżenie

Nie zalecamy usuwania wszystkich nietrwałych wystąpień, ponieważ obejmuje to wystąpienia, które zostały właśnie utworzone i nie zostały jeszcze utrwalone.