次の方法で共有


非永続化ワークフロー インスタンス

ワークフローの状態を SqlWorkflowInstanceStoreに保持する新しいインスタンスが作成されると、サービス ホストはインスタンス ストアでそのサービスのエントリを作成します。 その後、ワークフロー インスタンスが初めて永続化されると、 SqlWorkflowInstanceStore は現在のインスタンスの状態を格納します。 ワークフローが Windows プロセス アクティブ化サービスでホストされている場合、インスタンスが初めて永続化されるときに、サービスのデプロイ データもインスタンス ストアに書き込まれます。

ワークフロー インスタンスが永続化されていない限り、非 永続化 状態になります。 この状態では、アプリケーション ドメインのリサイクル、ホストのエラー、またはコンピューターの障害後にワークフロー インスタンスを回復することはできません。

非永続化状態

永続化されていない永続的なワークフロー インスタンスは、次の場合は非永続化状態のままです。

  • ワークフロー インスタンスが初めて永続化される前に、サービス ホストがクラッシュします。 ワークフロー インスタンスはインスタンス ストアに残り、復旧されません。 相関メッセージが到着すると、ワークフロー インスタンスは再びアクティブになります。

  • ワークフロー インスタンスでは、初めて永続化される前に例外が発生します。 返される UnhandledExceptionAction に応じて、次のシナリオが発生します。

    • UnhandledExceptionActionAbort に設定されている: 例外が発生すると、サービス デプロイ情報がインスタンス ストアに書き込まれ、ワークフロー インスタンスがメモリからアンロードされます。 ワークフロー インスタンスは永続化されていない状態のままであり、再読み込みすることはできません。

    • UnhandledExceptionActionCancel または Terminate に設定されている: 例外が発生すると、サービス デプロイ情報がインスタンス ストアに書き込まれ、アクティビティ インスタンスの状態が Closed に設定されます。

アンロードされた非永続化ワークフロー インスタンスが発生するリスクを最小限に抑えるために、ライフ サイクルの早い段階でワークフローを永続化することをお勧めします。

非永続化インスタンスの検出と削除

SqlWorkflowInstanceStoreは、永続化されていないワークフロー インスタンスをインスタンス ストアから削除しません。 また、非永続化ワークフロー インスタンスが関連付けられている期限切れのロック所有者も削除されません。

管理者は、永続化されていないインスタンスのインスタンス ストアを定期的にチェックすることをお勧めします。 管理者は、このワークフローが関連付けられたメッセージを受信しないことがわかっている限り、インスタンス ストアからこれらのインスタンスを削除できます。 たとえば、インスタンスが数か月間データベースに存在していて、ワークフローの有効期間が通常数日であることがわかっている場合は、これがクラッシュした初期化されたインスタンスであると仮定しても安全です。

SQL ワークフロー インスタンス ストアで永続化されていないインスタンスを見つけるには、次の SQL クエリを使用できます。

  • このクエリは、永続化されていないすべてのインスタンスを検索し、ID と作成時刻 (UTC 時刻に格納) を返します。

    select InstanceId, CreationTime
        from [System.Activities.DurableInstancing].[Instances]
        where IsInitialized = 0
    
  • このクエリは、永続化されておらず、読み込まれていないすべてのインスタンスを検索し、ID と作成時刻 (UTC 時刻に格納) を返します。

    select InstanceId, CreationTime
        from [System.Activities.DurableInstancing].[Instances]
        where IsInitialized = 0
            and CurrentMachine is NULL
    
  • このクエリは、永続化されていない中断されたインスタンスをすべて検索し、ID、作成時刻 (UTC 時刻に格納)、中断理由、および例外名を返します。

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

永続化されていないインスタンスを削除する場合は注意が必要です。 一般に、中断されている、または読み込まれていない WorkflowServiceHost によって作成された非永続化インスタンスを削除しても安全です。 これらの特定のインスタンスは、次の SQL コマンドを使用して [System.Activities.DurableInstancing].[Instances] ビューから削除し、正しいインスタンス ID に置き換えることで、ストアから削除できます。

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

Warnung

永続化されていないすべてのインスタンスは、作成され、まだ永続化されていないインスタンスが含まれるため、削除しないことをお勧めします。