永続参加要素
永続参加要素は、アプリケーション ホストによってトリガーされる永続化操作 (保存または読み込み) に参加できます。 .NET Framework 4.6.1 には PersistenceParticipant と PersistenceIOParticipant の 2 つの抽象クラスが付属しており、これらを使用して永続参加要素を作成できます。 永続参加要素はこれらのクラスの 1 つから派生し、目的のメソッドを実装して、このクラスのインスタンスを WorkflowExtensions の WorkflowServiceHost コレクションに追加します。 アプリケーション ホストは、ワークフロー インスタンスを永続化するときにこのようなワークフロー拡張機能を必要とする場合があり、適切なときに永続参加要素の適切なメソッドを呼び出します。
次の一覧では、永続化 (保存) 操作のさまざまな段階で永続化サブシステムが実行するタスクについて説明します。 3 番目および 4 番目の段階で永続参加要素が使用されます。 参加要素が I/O 参加要素 (I/O 操作にも参加する永続参加要素) の場合、その参加要素は 6 番目の段階でも使用されます。
ワークフロー状態、ブックマーク、マップされた変数、およびタイムスタンプなどの組み込みの値を収集します。
ワークフロー インスタンスに関連付けられた拡張コレクションに追加された永続参加要素を収集します。
すべての永続参加要素によって実装された CollectValues メソッドを呼び出します。
すべての永続参加要素によって実装された MapValues メソッドを呼び出します。
ワークフローを永続ストアに永続化または保存します。
すべての永続 I/O 参加要素の BeginOnSave メソッドを呼び出します。 参加要素が I/O 参加要素でない場合は、このタスクをスキップします。 永続化がトランザクションである場合、Transaction.Current プロパティにトランザクションが提供されます。
すべての永続参加要素が完了するのを待機します。 すべての参加要素がインスタンス データの永続化に成功したら、トランザクションをコミットします。
永続参加要素は PersistenceParticipant クラスから派生し、CollectValues および MapValues メソッドを実装できます。 永続 I/O 参加要素は PersistenceIOParticipant クラスから派生し、CollectValues および MapValues メソッドの実装に加えて BeginOnSave メソッドもメソッド実装できます。
それぞれの段階の完了後に次の段階が開始されます。 たとえば、最初の段階では、すべての永続参加要素から値が収集されます。 2 番目の段階では、最初の段階で収集されたすべての値がマップのためにすべての永続参加要素に提供されます。 3 番目の段階では、1 番目および 2 番目の段階で収集してマップされたすべての値が永続参加要素に提供されます。
次の一覧では、読み込み操作のさまざまな段階で永続化サブシステムが実行するタスクについて説明します。 4 番目の段階で永続参加要素が使用されます。 永続 I/O 参加要素 (I/O 操作にも参加する永続参加要素) は 3 番目の段階でも使用されます。
ワークフロー インスタンスに関連付けられた拡張コレクションに追加された永続参加要素を収集します。
永続ストアからワークフローを読み込みます。
すべての永続 I/O 参加要素の BeginOnLoad を呼び出して、すべての永続参加要素が完了するのを待機します。 永続化がトランザクションである場合、Transaction.Current にトランザクションが提供されます。
永続ストアから取得されたデータに基づいて、メモリ内のワークフロー インスタンスを読み込みます。
各永続参加要素の PublishValues メソッドを呼び出します。
永続参加要素は PersistenceParticipant クラスから派生し、PublishValues メソッドを実装できます。 永続 I/O 参加要素は PersistenceIOParticipant クラスから派生し、PublishValues メソッドの実装に加えて BeginOnLoad メソッドも実装できます。
ワークフロー インスタンスを読み込む場合、永続化プロバイダーはそのインスタンスのロックを作成します。 これにより、各インスタンスが複数ノードのシナリオでは、複数のホストによって読み込まれることはありません。 ロックされたワークフロー インスタンスを読み込もうとすると、次のような例外が表示されます: 例外「System.ServiceModel.Persistence.InstanceLockException: 要求された操作は、インスタンス '00000000-0000-0000-0000-000000000000' のロックが取得できなかったため、完了できませんでした」。 このエラーが発生するのは、次のいずれかが発生した場合です。
複数ノード シナリオで、インスタンスが他のホストによって読み込まれます。 これらの種類の競合を解決する方法がいくつかあります。ロックと再試行を所有するノードへ処理を転送するか、または他のホストでの作業を保存できないようにする読み込みを強制します。
単一ノード シナリオで、ホストがクラッシュしました。 ホストが再度起動されるとき (プロセスのリサイクル、または新しい永続化プロバイダー ファクトリの作成)、新しいホストが、ロックの期限がまだ切れていないために古いホストによってまだロックされているインスタンスの読み込みを試みます。
単一ノード シナリオで、当該インスタンスがあるポイントで中止され、別のホスト ID を持つ新しい永続化プロバイダー インスタンスが作成されます。
ロックのタイムアウト値の既定値は 5 分です。呼び出したときに、別のタイムアウト値を指定できます Load。
このセクションの内容
関連項目
.NET