Windows ワークフロー永続性サービス
多くのビジネス プロセスは、完了までに長い時間 (数か月、ときには数年) がかかります。ワークフローをメモリ内に保持することは、メモリ容量には限りがあるため現実的ではなく、また、1 つのインスタンスは 1 つのサーバー上で処理する必要があるため、拡張性もなくなります。長時間にわたって実行されるワークフローの多くは、フローや処理ロジックを活発に実行しているわけではなく、ユーザーや他のシステムからの入力待ちで事実上アイドル状態になっています。アイドル状態のインスタンスをアンロードすると、メモリを節約できるだけでなく、処理サーバー全体の高いスケーラビリティを実現できます。
ワークフローの実行中に特定の条件が発生すると、ランタイムに読み込まれているワークフロー ランタイム エンジンは永続性サービスを使用して、ワークフロー インスタンスについての状態情報を永続化します。これらの条件には、以下のものが含まれます。
TransactionScopeActivity アクティビティ内のアトミックなトランザクションと CompensatableTransactionScopeActivity アクティビティが完了したとき。
ワークフロー インスタンスがアイドル状態になり、WorkflowPersistenceService について UnloadOnIdle フラグが true に設定されたとき。たとえば、DelayActivity アクティビティを使用すると、これが発生します。
ランタイム ホスト アプリケーションがワークフロー インスタンス上で System.Workflow.Runtime.WorkflowInstance.Unload または System.Workflow.Runtime.WorkflowInstance.TryUnload を呼び出したとき。
ワークフロー インスタンスが終了したとき。
PersistOnCloseAttribute 属性を使用するカスタム アクティビティが完了したとき。
これらの条件のいずれかが満たされ、ランタイム エンジンに永続性サービスが追加されている場合、ランタイム エンジンは永続性サービスによって提供されるメソッドを呼び出し、ワークフロー インスタンスについての状態情報を保存します。同様に、ワークフロー ランタイム エンジンが以前に永続化されたワークフロー インスタンスを復元する必要がある場合、ランタイム エンジンは永続性サービスによって提供されるメソッドを呼び出し、その状態情報を読み込みます。つまり、永続化が発生するタイミングはワークフロー ランタイム エンジンによって決定されますが、必要な永続化操作の実行は永続性サービスに依存しています。
SqlWorkflowPersistenceService によって管理されるワークフロー状態には、タイマ情報もあります。ワークフロー定義内で DelayActivity アクティビティを構成し、SqlWorkflowPersistenceService のような永続性サービスを使用するたびに、そのアクティビティに関連付けられている期間情報がワークフロー状態の一部として永続化されます。ワークフロー インスタンスがワークフロー ランタイムによって評価されるたびに、保留中のタイマ イベントが処理されます。
永続性サービスの作成
WorkflowPersistenceService クラスからクラスを派生させることにより、永続性サービスを作成できます。永続性サービスをワークフロー ランタイム エンジンに追加するには、AddService を呼び出すか、アプリケーション構成ファイルに適切なエントリを追加します。Windows Workflow Foundation に用意されている SqlWorkflowPersistenceService クラスは、そのまますぐに使用できる永続性サービスですが、拡張して使用することもできます。カスタム永続性サービスの作成の詳細については、「カスタム永続性サービスの作成」を参照してください。SqlWorkflowPersistenceService クラスの使用方法の詳細については、「SqlWorkflowPersistenceService の使用」を参照してください。
メモ : |
---|
.WorkflowRuntime に含めることができる永続性サービスは 1 つだけです。 |
ワークフロー状態情報のロック
ワークフロー ランタイム エンジンには、ワークフロー状態情報をロックするためのセマンティクスがあります。これは、別のプロセスで実行している永続性サービスが単一のデータ ストアにアクセスできる環境でワークフロー状態情報を使用するためのものです。WorkflowPersistenceService クラスを使用すると、ワークフロー ランタイム エンジンのこの機能をサポートできます。そのためには、ワークフロー インスタンスの状態情報のロックをデータ ストアで解除するかどうかを指定するパラメータを SaveWorkflowInstanceState に提供し、以前にロックされたワークフロー状態情報のロックを解除する UnlockWorkflowInstanceState メソッドを提供します。ロックを実装する永続性サービスでは、LoadWorkflowInstanceState を呼び出してワークフロー インスタンスの状態情報をロックする必要があります。
独自の永続性サービスを作成する場合は、サービスが状態情報をデータ ストアに保存しないか、データ ストアから状態情報を読み込まないときに、PersistenceException をスローするようにしてください。ワークフロー ランタイム エンジンにはこの動作が必要です。
永続性サービスのバッチ動作
耐久性のあるストアを使用してワークフローの状態情報を保存するサービスには、バッチ メカニズムが用意されています。このような場合には、永続性サービスで使用する耐久性のあるストアとワークフロー ランタイム エンジンの内部状態の整合性を保持することが重要です。IPendingWork インターフェイスで定義されている機能をサービスに追加してから、WorkflowCommitWorkBatchService サービスによって提供されているワークフロー トランザクション バッチに参加することができます。これは、データ ストアに対する変更を WorkBatch に対する作業項目として追加することによって行います。詳細については、SaveCompletedContextActivity または SaveWorkflowInstanceState のトピックを参照してください。
複雑なホスト シナリオ
Windows Workflow Foundation ソリューションを配置する際のシナリオとして、異なるデスクトップおよびサーバー構成で実行しているそれぞれ別のサービス セットを持つ、複数のホスト アプリケーションを作成することが考えられます。そのようなシナリオでは、ソリューション内で定義される一部のワークフローについて、特定のシステム上に限って実行できるようにするという要件がある場合があります。Windows Workflow Foundation に用意されている、SqlWorkflowPersistenceService サービスなどのそのまますぐに使用できるサービスでは、この種の構成をサポートしていません。特定のワークフロー インスタンスが読み込まれるシステムを制御するには、カスタム永続性サービスを作成する必要があります。詳細については、「カスタム永続性サービスの作成」を参照してください。
関連項目
参照
SqlWorkflowPersistenceService
SqlPersistenceWorkflowInstanceDescription
WorkflowPersistenceService
WorkBatch
概念
SqlWorkflowPersistenceService の使用
カスタム永続性サービスの作成
その他の技術情報
Windows Workflow Foundation サービス
演習 4: ランタイム サービスの使用
Using Persistence Services
Copyright © 2007 by Microsoft Corporation.All rights reserved.