永続化参加要素は、アプリケーション ホストによってトリガーされる永続化操作 (保存または読み込み) に参加できます。 .NET Framework 4.6.1 には、永続化参加要素の作成に使用できる 2 つの抽象クラス PersistenceParticipant と PersistenceIOParticipant が付属しています。 永続化参加要素は、これらのクラスの 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 ステージのすべての永続化参加者に提供されます。 その後、1 番目と 2 番目のステージで収集およびマップされたすべての値が、3 番目のステージの永続化プロバイダーに提供されます。
次の一覧では、永続化サブシステムが Load 操作のさまざまな段階で実行するタスクについて説明します。 第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-0000-00000000000' のロックを取得できなかったため、要求された操作を完了できませんでした" のような例外が表示されます。 このエラーは、次のいずれかが発生した場合に発生します。
マルチノード シナリオでは、インスタンスは別のホストによって読み込まれます。 これらの種類の競合を解決するには、いくつかの方法があります。ロックと再試行を所有するノードに処理を転送するか、他のホストが作業を保存できなくなる負荷を強制します。
単一ノードのシナリオで、ホストがクラッシュしました。 ホストが再び起動すると (プロセスのリサイクルまたは新しい永続化プロバイダー ファクトリの作成)、新しいホストは、ロックの有効期限がまだ切れていないため、古いホストによってロックされているインスタンスの読み込みを試みます。
単一ノードのシナリオでは、問題のインスタンスがある時点で中止され、別のホスト ID を持つ新しい永続化プロバイダー インスタンスが作成されます。
ロック タイムアウト値の既定値は 5 分で、 Loadを呼び出すときに別のタイムアウト値を指定できます。
このセクションにて
こちらも参照ください
.NET