SQL ワークフロー インスタンス ストアの InstanceLockedExceptionAction プロパティを使用すると、SQL 永続化プロバイダーが InstanceLockedExceptionを受け取ったときに実行するアクションを指定できます。 永続化プロバイダーは、別のサービス ホストによって現在ロックされているワークフロー サービス インスタンスをロックしようとすると、この例外を受け取ります。 このプロパティの値は、 NoRetry、 BasicRetry、および AggressiveRetryです。 既定値は NoRetry です。 次の一覧では、3 つのオプションについて説明します。
NoRetry。 サービス ホストはワークフロー サービス インスタンスをロックしようとせず、 InstanceLockedException を呼び出し元に渡します。 ワークフローが 60 秒を超える期間メモリ内にとどまっている場合は、再試行として NoRetry を使用します。 既定値は NoRetry です。
BasicRetry。 サービス ホストは、再試行の間隔を線形に設定してワークフロー サービス インスタンスをロックし直し、シーケンスの最後に InstanceLockedException を呼び出し元に渡します。 ワークフローが約 5 ~ 60 秒の間メモリ内にとどまり、メッセージがバッチで受信され、同じホスト上の同じインスタンスにメッセージが送信され、ワークフローをアンロードする前にすべてのメッセージが処理される可能性が高い場合は、 BasicRetry を使用してリソースを無駄にすることなく最適な待機時間を実現します。
AggressiveRetry。 サービス ホストは、再試行の間に指数バックオフ間隔でワークフロー サービス インスタンスをロックするように再試行し、シーケンスの最後に呼び出し元に例外を渡します。 ワークフローが非常に短い時間 (5 秒未満) メモリ内にとどまっている場合、または Web ファームが大きく、同じホストに別のメッセージが配信される可能性があまり高くない場合は、 AggressiveRetry を使用して最適な待機時間を実現します。
インスタンス ロック例外アクション機能は、次のシナリオをサポートしています。 すべてのシナリオで、SqlWorkflowInstanceStore の instanceLockedExceptionAction プロパティが BasicRetry または AggressiveRetryに設定されている場合、ホストはインスタンスのロックを定期的に取得するために透過的に再試行します。
アプリケーション ドメインの正常なシャットダウンと重複するリサイクルの有効化。 ワークフロー サービス インスタンスを実行するサービス ホストを持つ AppDomain がリサイクルされ、古い AppDomain が正常に停止している間に、新しい AppDomain が並列で新しい要求を処理するように起動されるとします。 シャットダウンは、ワークフロー サービス インスタンスがアイドル状態になるまで待機し、インスタンスを永続化してアンロードします。 新しい AppDomain 内のホストがインスタンスをロックしようとすると、 InstanceLockedExceptionが発生します。
サーバーの均一なファーム全体で持続的なワークフローを水平方向にスケーリングします。 ワークフロー インスタンスが実行されているサーバー ファームのノードがクラッシュし、ワークフロー ホストが実行中のインスタンスのロックを削除できないとします。 ファームの別のノードで実行されているサービス ホストは、そのワークフロー インスタンスのメッセージを受信すると、 InstanceLockedExceptionを受信するこれらのインスタンスのロックを取得しようとします。 ロックを更新するはずのホストが存在しなくなったため、ロックはしばらくすると期限切れになります。
サーバーの均一なファーム全体で持続的なワークフローを水平方向にスケーリングします。 NLB (ネットワーク ロード バランサー) の背後にある複数のホストを使用して永続的なワークフローを水平方向にスケーリングする場合、ファームの 1 つのノードで実行されているワークフロー ホストがワークフロー インスタンスを読み込んでメッセージを処理しており、NLB には既にインスタンスを実行しているホストにメッセージを配信するルーティング アルゴリズムがないため、インスタンスへの次のメッセージが別のノードで実行されているホストにルーティングされているとします。 メッセージを受信すると、2 番目のホストはワークフロー インスタンスの読み込みを試み、最初のホストがインスタンスにロックを持っているため、 InstanceLockedException を受け取ります。 最初のホストは、最初のメッセージの処理が完了するとインスタンスのロックを解除し、2 番目のホストは次回再試行時にロックを取得し、インスタンスを読み込み、2 番目のメッセージを処理します。
.NET