Freigeben über


Nicht persistente Workflowinstanzen

Wenn eine neue Instanz eines Workflows erstellt wird, die ihren Status im SqlWorkflowInstanceStoreInstanzspeicher beibehalten, erstellt der Diensthost einen Eintrag für diesen Dienst im Instanzspeicher. Wenn die Workflowinstanz zum ersten Mal beibehalten wird, speichert die SqlWorkflowInstanceStore Instanz den aktuellen Instanzstatus. Wenn der Workflow im Windows-Prozessaktivierungsdienst gehostet wird, werden die Dienstbereitstellungsdaten auch in den Instanzspeicher geschrieben, wenn die Instanz zum ersten Mal beibehalten wird.

Solange die Workflowinstanz nicht beibehalten wurde, befindet sie sich in einem nicht dauerhaften Zustand. In diesem Zustand kann die Workflowinstanz nicht wiederhergestellt werden, nachdem eine Anwendungsdomäne neu gestartet wurde, ein Hostfehler oder ein Computerfehler aufgetreten ist.

Nicht persistenter Zustand

Permanente Workflowinstanzen, die noch nicht persistent gespeichert wurden, behalten in den folgenden Fällen den Zustand nicht persistent bei:

  • Der Diensthost stürzt ab, bevor die Workflowinstanz zum ersten Mal beibehalten wird. Die Workflowinstanz verbleibt im Instanzspeicher und wird nicht wiederhergestellt. Wenn eine korrelierte Nachricht eingeht, wird die Workflowinstanz wieder aktiv.

  • Die Workflowinstanz erlebt eine Ausnahme, bevor sie zum ersten Mal beibehalten wird. Je nach dem zurückgegebenen UnhandledExceptionAction treten die folgenden Szenarien auf:

    • UnhandledExceptionAction ist auf Abort festgelegt: Bei einer Ausnahme werden die Bereitstellungsinformationen in den Instanzspeicher geschrieben, und die Workflowinstanz wird aus dem Speicher entladen. Die Workflowinstanz verbleibt in einem nicht persistierten Zustand und kann nicht neu geladen werden.

    • UnhandledExceptionAction ist auf Cancel oder Terminate festgelegt: Bei einer Ausnahme werden die Bereitstellungsinformationen in den Instanzspeicher geschrieben, und der Zustand der Aktivitätsinstanz wird auf Closed festgelegt.

Um das Risiko zu minimieren, dass ungeladene, nicht persistente Workflowinstanzen auftreten, wird empfohlen, den Workflow frühzeitig im Lebenszyklus beizubehalten.

Erkennen und Entfernen nicht persistenter Instanzen

Der SqlWorkflowInstanceStore entfernt keine nicht persistenten Workflowinstanzen aus dem Instanzspeicher. Besitzer von abgelaufenen Sperren, die mit nicht persistent gespeicherten Workflowinstanzen verknüpft sind, werden ebenfalls nicht entfernt.

Es wird empfohlen, dass der Administrator regelmäßig den Instanzspeicher auf nicht persistente Instanzen überprüft. Administratoren können diese Instanzen aus dem Instanzspeicher entfernen, solange sie wissen, dass dieser Workflow keine korrelierten Nachrichten empfängt. Wenn die Instanz beispielsweise mehrere Monate lang in der Datenbank war und bekannt ist, dass der Workflow in der Regel eine Lebensdauer von mehreren Tagen hat, wäre es sicher, davon auszugehen, dass es sich um eine initialisierte Instanz handelte, die abgestürzt war.

Um nicht persistente Instanzen im SQL-Workflowinstanzspeicher zu finden, können Sie die folgenden SQL-Abfragen verwenden:

  • Diese Abfrage findet alle Instanzen, die nicht beibehalten wurden, und gibt die ID und die Erstellungszeit (in UTC-Zeit gespeichert) für sie zurück.

    select InstanceId, CreationTime
        from [System.Activities.DurableInstancing].[Instances]
        where IsInitialized = 0
    
  • Diese Abfrage findet alle Instanzen, die nicht beibehalten wurden und die nicht geladen werden, und gibt die ID und die Erstellungszeit (in UTC-Zeit gespeichert) für sie zurück.

    select InstanceId, CreationTime
        from [System.Activities.DurableInstancing].[Instances]
        where IsInitialized = 0
            and CurrentMachine is NULL
    
  • Diese Abfrage findet alle angehaltenen Instanzen, die nicht beibehalten wurden, und gibt die ID, die Erstellungszeit (gespeichert in UTC-Zeit), den Anhaltegrund und den Ausnahmenamen für sie zurück.

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

Gehen Sie beim Löschen nicht persistent gespeicherter Instanzen mit Bedacht vor. Im Allgemeinen ist es sicher, nicht persistente Instanzen zu entfernen, die von WorkflowServiceHost erstellt wurden und angehalten sind oder nicht geladen wurden. Diese spezifischen Instanzen können aus dem Speicher gelöscht werden, indem sie aus der [System.Activities.DurableInstancing].[Instances] Ansicht mithilfe des folgenden SQL-Befehls gelöscht werden, wobei die richtige Instanz-ID ersetzt wird.

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

Warnung

Es wird nicht empfohlen, alle nicht dauerhaften Instanzen zu entfernen, da dies Instanzen umfasst, die soeben erstellt wurden und noch nicht beibehalten wurden.