Nicht beibehaltene Workflowinstanzen

Wenn eine neue Workflowinstanz erstellt wird, deren Zustandsinformationen persistent in SqlWorkflowInstanceStore gespeichert werden, erstellt der Diensthost einen Eintrag für diesen Dienst im Instanzspeicher. Wenn die Workflowinstanz zum ersten Mal persistent gespeichert wird, wird anschließend der derzeitige Zustand der Instanz in SqlWorkflowInstanceStore gespeichert. Wenn der Workflow im Windows-Prozessaktivierungsdienst gehostet wird, werden die Bereitstellungsdaten für den Dienst auch dann in den Instanzspeicher geschrieben, wenn die Instanz zum ersten Mal persistent gespeichert wird.

Solange die Workflowinstanz nicht persistent gespeichert wurde, ist ihr Zustand nicht persistent. In diesem Zustand kann die Workflowinstanz bei Wiederherstellung einer Anwendungsdomäne oder einem Ausfall des Hosts oder Computers nicht wiederhergestellt werden.

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 persistent gespeichert wurde. Die Workflowinstanz verbleibt im Instanzspeicher und wird nicht wiederhergestellt. Bei Empfang einer korrelierten Meldung wird die Workflowinstanz erneut aktiviert.

  • Es tritt eine nicht behandelte Ausnahme auf, bevor die Workflowinstanz zum ersten Mal persistent gespeichert wurde. Abhängig von der zurückgegebenen UnhandledExceptionAction ergeben sich folgende Szenarien:

    • 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 im nicht persistenten Zustand und kann nicht erneut 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 bezüglich des Entladens nicht persistenter Workflowinstanzen zu minimieren, wird empfohlen, den Workflow zu einem frühen Zeitpunkt des Lebenszyklus persistent zu speichern.

Erkennen und Entfernen nicht persistenter Instanzen

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

Es wird empfohlen, den Instanzspeicher vom Administrator in regelmäßigen Abständen auf nicht persistent gespeicherte Instanzen überprüfen zu lassen. Entsprechende Instanzen können vom Administrator aus dem Instanzspeicher entfernt werden, solange feststeht, dass sie keine korrelierten Meldungen empfangen. Beispiel: Wenn eine Instanz sich bereits mehrere Monate in der Datenbank befindet und bekannt ist, dass der Workflow in der Regel eine Lebensdauer von einigen Tagen hat, können Sie sicher davon ausgehen, dass es sich um eine initialisierte Instanz handelt, die abgestürzt ist.

Mit folgenden SQL-Abfragen können Sie nach nicht persistent gespeicherten Instanzen im SQL-Workflowinstanzspeicher suchen:

  • Mit dieser Abfrage wird nach allen Instanzen gesucht, die nicht persistent gespeichert wurden, und die zugehörige ID sowie der Zeitpunkt der Erstellung (in UTC-Zeit) werden zurückgegeben.

    select InstanceId, CreationTime
        from [System.Activities.DurableInstancing].[Instances]
        where IsInitialized = 0
    
  • Mit dieser Abfrage wird nach allen Instanzen gesucht, die nicht persistent gespeichert wurden und nicht geladen sind, und die zugehörige ID sowie der Zeitpunkt der Erstellung (in UTC-Zeit) werden zurückgegeben.

    select InstanceId, CreationTime
        from [System.Activities.DurableInstancing].[Instances]
        where IsInitialized = 0
            and CurrentMachine is NULL
    
  • Mit dieser Abfrage wird nach allen angehaltenen Instanzen gesucht, die nicht persistent gespeichert wurden, und die zugehörige ID, der Zeitpunkt der Erstellung (in UTC-Zeit), der Grund für die Unterbrechung und der Name der Ausnahme werden zurückgegeben.

    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, von WorkflowServiceHost erstellte nicht persistente Instanzen zu entfernen, die angehalten wurden oder nicht geladen sind. Diese Instanzen können aus dem Speicher entfernt werden, indem sie aus der [System.Activities.DurableInstancing].[Instances]-Sicht gelöscht werden. Verwenden Sie dazu den folgenden SQL-Befehl, und geben Sie die korrekte Instanz-ID an.

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

Warnung

Es wird nicht empfohlen, alle nicht persistent gespeicherten Instanzen zu entfernen, da davon auch Instanzen betroffen sein können, die erst kürzlich erstellt und noch nicht persistent gespeichert wurden.