ワークフロー サービス ホストの内部
WorkflowServiceHost では、ワークフロー サービスのホストが提供されます。 これにより、受信メッセージをリッスンして、該当するワークフロー サービス インスタンスにルーティングし、アイドル状態のワークフローのアンロードおよび永続化を制御できます。 このトピックでは、WorkflowServiceHost がどのように受信メッセージを処理するかについて説明します。
WorkflowServiceHost の概要
WorkflowServiceHost クラスは、ワークフロー サービスをホストするために使用されます。 このクラスは、受信メッセージをリッスンして、該当するサービス インスタンスにルーティングし、必要に応じて、新しいインスタンスを作成するか、永続ストレージから既存のインスタンスを読み込みます。 次の図は、WorkflowServiceHost の動作の概要を示しています。
この図では、WorkflowServiceHost は .xamlx ファイルからワークフロー サービス定義を読み込み、構成ファイルから構成情報を読み込みます。 また、追跡プロファイルから追跡構成を読み込みます。 WorkflowServiceHost によって、ワークフロー インスタンスへの制御操作の送信を可能にするワークフロー コントロール エンドポイントが公開されます。 詳細については、ワークフロー コントロール エンドポイントのサンプルを参照してください。
WorkflowServiceHost によって、受信アプリケーション メッセージをリッスンするアプリケーション エンドポイントも公開されます。 受信メッセージが到着すると、該当するワークフロー サービス インスタンスに送られます (現在読み込み中の場合)。 必要に応じて、新しいワークフロー インスタンスが作成されます。 既存のインスタンスが永続化されている場合は、永続ストアから読み込まれます。
WorkflowServiceHost の詳細
次の図は、WorkflowServiceHost でのメッセージの処理方法をさらに詳細に示しています。
この図には、3 つの異なるエンドポイント (アプリケーション エンドポイント、ワークフロー コントロール エンドポイント、およびワークフローをホストするエンドポイント) が示されています。 アプリケーション エンドポイントは、特定のワークフロー インスタンスにバインドされたメッセージを受信します。 ワークフロー コントロール エンドポイントは、制御操作をリッスンします。 ワークフローをホストするエンドポイントは、WorkflowServiceHost がサービス以外のワークフローを読み込んで実行するためのメッセージをリッスンします。 この図が示すように、すべてのメッセージは、WCF ランタイム中に処理されます。 ワークフロー サービス インスタンスの調整は、MaxConcurrentInstances プロパティを使用して実現されます。 このプロパティは、同時ワークフロー サービス インスタンスの数を制限します。 この調整を超過すると、新しいワークフロー サービス インスタンスの追加要求または永続化されたワークフロー インスタンスのアクティブ化の要求がキューに置かれます。 キューに置かれた要求は、新規インスタンスと実行中の永続化されたインスタンスのどちらに対するものであるかにかかわらず、FIFO 順で処理されます。 未処理の例外の処理方法およびアイドル状態のワークフロー サービスのアンロードおよび永続化方法を指定するホスト ポリシー情報が読み込まれます。 これらのトピックの詳細については、「方法: WorkflowServiceHost を使用してワークフローのハンドルされない例外の動作を構成する」および「方法: WorkflowServiceHost を使用してアイドル動作を構成する」を参照してください。 ワークフロー インスタンスは、ホスト ポリシーに従って永続化され、必要に応じて再度読み込まれます。 ワークフローの永続性の詳細については、「方法: WorkflowServiceHost を使用して永続性を構成する」、長時間のワークフロー サービスの作成に関するページ、および「ワークフローの永続性」を参照してください。
次の図は、WorkflowServiceHost.Open が呼び出されたときのフローを示しています。
ワークフローが XAML から読み込まれ、アクティビティ ツリーが作成されます。 WorkflowServiceHost は、アクティビティ ツリーに従い、サービスの記述を作成します。 構成がホストに適用されます。 最後に、ホストは受信メッセージのリッスンを開始します。
次の図は、CanCreateInstance が true
に設定されている Receive アクティビティにバインドされたメッセージを受信したときの WorkflowServiceHost の動作を示しています。
メッセージが到着し、WCF チャネル スタックによって処理されます。 スロットルがチェックされ、関連付けクエリが実行されます。 既存のインスタンスにバインドされているメッセージは配信されます。 新しいインスタンスを作成する必要がある場合は、Receive アクティビティの CanCreateInstance プロパティが確認されます。 true に設定されている場合、新しいインスタンスが作成され、メッセージが配信されます。
次の図は、CanCreateInstance が false に設定された場合の Receive アクティビティにバインドされたメッセージを受信したときの WorkflowServiceHost の動作を示しています。
メッセージが到着し、WCF チャネル スタックによって処理されます。 スロットルがチェックされ、関連付けクエリが実行されます。 メッセージが既存のインスタンスにバインドされている場合は (CanCreateInstance が false に設定されているため) インスタンスが永続ストアから読み込まれ、ブックマークが再開され、ワークフローが実行されます。
警告
SQL Server が NamedPipe プロトコルでのみリッスンするように設定されている場合、ワークフロー サービス ホストは開きません。