中断されたインスタンスの管理

SuspendedInstanceManagement サンプルでは、中断されているワークフロー インスタンスを管理する方法を示します。 WorkflowUnhandledExceptionBehavior の既定のアクションは AbandonAndSuspend です。 つまり、既定では、WorkflowServiceHost でホストされるワークフロー インスタンスからスローされた未処理の例外により、インスタンスがメモリから破棄され、インスタンスの永続バージョンが中断状態としてマークされることになります。 中断されたワークフロー インスタンスは、中断が解除されるまで実行できません。

このサンプルでは、コマンド ライン ユーティリティを実装して、中断されたインスタンスについてクエリを実行する方法、およびユーザーがインスタンスを再開または終了できるようにする方法を示します。 このサンプルでは、ワークフロー サービスから例外が意図的にスローされ、中断状態になります。 その後、コマンド ライン ユーティリティを使用してインスタンスについてクエリを実行し、さらに、インスタンスを再開または終了できます。

対象

Windows Workflow Foundation (WF) で WorkflowUnhandledExceptionBehaviorWorkflowControlEndpoint を使用した WorkflowServiceHost

ディスカッション

このサンプルに実装されているコマンド ライン ユーティリティは、.NET Framework 4.6.1 に用意されている SQL インスタンス ストアの実装に固有のものです。 インスタンス ストアのカスタム実装がある場合は、サンプルの WorkflowInstanceCommand の実装を、使用しているインスタンス ストアに固有の実装に置き換えることで、このユーティリティを調整できます。

用意されている実装では、SQL インスタンス ストアに対して SQL コマンドを直接実行して、中断されたインスタンスのリストを取得し、WorkflowControlEndpoint に追加された WorkflowServiceHost を使用して、インスタンスを再開または終了できるようにします。

サンプルをセットアップ、ビルド、および実行するには

  1. このサンプルでは、次の Windows コンポーネントが有効になっている必要があります。

    1. Microsoft メッセージ キュー (MSMQ) サーバー

    2. SQL Server Express

  2. SQL Server データベースを設定します。

    1. Visual Studio のコマンド プロンプトで、SuspendedInstanceManagement サンプル ディレクトリから "setup.cmd" を実行します。これにより、次の操作が行われます。

      1. SQL Server Express を使用して永続性データベースを作成します。 永続性データベースが既に存在する場合、データベースは削除され、再作成されます。

      2. 永続化のためにデータベースを設定します。

      3. IIS APPPOOL\DefaultAppPool および NT AUTHORITY\Network Service を、永続化のためにデータベースを設定するときに定義された InstanceStoreUsers ロールに追加します。

  3. サービス キューを設定します。

    1. Visual Studio で、SampleWorkflowApp プロジェクトを右クリックして、 [スタートアップ プロジェクトに設定] をクリックします。

    2. F5 キーを押して SampleWorkflowApp をコンパイルし、実行します。 これにより、必要なキューが作成されます。

    3. Enter キーを押して SampleWorkflowApp を停止します。

    4. コマンド プロンプトから Compmgmt.msc を実行して、[コンピューターの管理] コンソールを開きます。

    5. [サービスとアプリケーション][メッセージ キュー][専用キュー] の順に展開します。

    6. [ReceiveTx] キューを右クリックして、 [プロパティ] をクリックします。

    7. [セキュリティ] タブをクリックし、Everyone グループに対して [メッセージの受信][メッセージのピーク] 、および [メッセージの送信] アクセス許可を与えます。

  4. サンプルを実行します。

    1. Visual Studio で、Ctrl+F5 キーを押して、SampleWorkflowApp プロジェクトをデバッグなしで再度実行します。 2 つのエンドポイント アドレスがコンソール ウィンドウに出力されます。1 つはアプリケーション エンドポイントのアドレスで、もう 1 つは WorkflowControlEndpoint のアドレスです。 その後、ワークフロー インスタンスが作成され、そのインスタンスの追跡レコードがコンソール ウィンドウに表示されます。 ワークフロー インスタンスから例外がスローされ、インスタンスは中断されて中止されます。

    2. 次に、コマンド ライン ユーティリティを使用して、これらのインスタンスに対してさらに操作を実行できます。 コマンド ライン引数の構文は次のとおりです。

      SuspendedInstanceManagement -Command:[CommandName] -Server:[ServerName] -Database:[DatabaseName] -InstanceId:[InstanceId]

      サポートされるコマンドは、QueryResume、および Terminate です。 InstanceId スイッチを指定する必要があるのは、Resume 操作および Terminate 操作だけです。

クリーンアップするには (省略可能)

  1. Compmgmt.msc を実行して、[コンピューターの管理] コンソールを開きます。

  2. [サービスとアプリケーション][メッセージ キュー][専用キュー] の順に展開します。

  3. [ReceiveTx] キューを削除します。

  4. 永続性データベースを削除するには、cleanup.cmd を実行します。