Service Broker を使用したアプリケーションのビルド

Service Broker は Transact-SQL ステートメントを実行できる任意のプログラムから使用できます。Service Broker アプリケーションは、SQL Server の外部で稼動するプログラムとして実装したり、Transact-SQL または .NET 言語で記述したストアド プロシージャとして実装したりできます。

一般に、Service Broker を使用するプログラムは、タスクの実行のために連携する複数のプログラムで構成されます。メッセージ交換を開始するプログラムは、メッセージを作成し、別のサービスに向けて送信します。送信したプログラムは、応答が返るまで待機するか、即座に終了して応答の処理を別のプログラムに委ねます。メッセージ交換の対象となるサービスでは、プログラムはサービス キューから受信メッセージを受け取って、メッセージ データを読み取り、必要な処理を行った後で、必要に応じて応答メッセージを作成し、送信します。

Service Broker は Transact-SQL を拡張するものです。アプリケーションでは、Service Broker と連携するための特別なオブジェクト モデルやライブラリは必要ありません。代わりに、プログラムは Transact-SQL コマンドを SQL Server に送信し、コマンドの結果を処理します。アプリケーションを、Service Broker によってアクティブ化したり、バックグラウンド サービスとして稼動させたり、スケジュールされたジョブとして実行したり、イベントへの応答として開始したりできます。Service Broker を使用してアプリケーションを開始する方法の詳細については、「起動方法の選択」を参照してください。

Service Broker でアプリケーションを作成する方法の詳細については、「Service Broker によるプログラミングの利点」を参照してください。

Service Broker アプリケーションの概要

次の図は、Service Broker を使用するアプリケーションの相互運用について説明しています。

メッセージ交換におけるメッセージの関係と流れ

図に示すように、SubmitExpense メッセージ型、AcceptDenyExpense メッセージ型、および ReimbursementIssued メッセージ型が最初に作成されます。ProcessExpenses コントラクトはこれらのメッセージ型に基づいて作成され、費用を返済するタスクを完了させるメッセージ交換を行うためのスキーマを提供します。ProcessExpenses コントラクトにより、ProcessExpense サービスと SubmitExpense サービスの間のすべてのメッセージ交換が制御されます。ProcessExpenses コントラクトとそこで使用されるメッセージ型は、このコントラクトに基づくメッセージ交換を行うすべてのサービスのデータベース内に存在している必要があります。

Service Broker は、SubmitExpense サービス宛てに送信されたメッセージをこのサービスのキューに格納します。ExpenseSubmission ストアド プロシージャは、このキューからメッセージを受け取って処理し、応答が必要な場合はメッセージを別のサービスに送信します。

Service Broker は、ProcessExpense サービス宛てに送信されたメッセージをこのサービスのキューに格納します。ExpenseProcessing ストアド プロシージャは、このキューからメッセージを受け取って処理し、応答が必要な場合はメッセージを別のサービスに送信します。

これら 2 つのサービス間のメッセージ交換は、次のような構成になります。

  • ユーザーは、ユーザー インターフェイスを介して費用を返済する要求を送信します。アプリケーションは、ExpenseSubmission ストアド プロシージャを実行し、これによって SubmitExpense メッセージが作成されます。SubmitExpense サービスは、ProcessExpense サービスとのメッセージ交換を開始し、SubmitExpense メッセージを ProcessExpense サービスに送信します。

  • Service Broker は ProcessExpense サービス宛ての SubmitExpense メッセージを受信すると、そのメッセージを ExpenseQueue キューに格納します。ExpenseQueue キューは ProcessExpense ストアド プロシージャをアクティブ化します。このストアド プロシージャでは、SubmitExpense メッセージをキューから解除し、処理します。ProcessExpense ストアド プロシージャは、AcceptDenyExpense メッセージを作成し、このメッセージを SubmitExpense サービスに送信します。この費用が却下された場合、ProcessExpense ストアド プロシージャはメッセージ交換を終了します。

  • Service Broker は、SubmitExpense サービス宛ての AcceptDenyExpense メッセージをこのサービスのキューに格納します。ProcessExpense プロシージャがメッセージ交換を終了した場合、Service Broker は EndDialog メッセージを Expenses キューに格納します。キューは ExpenseSubmission ストアド プロシージャをアクティブ化します。このストアド プロシージャでは、AcceptDenyExpense メッセージをキューから解除し、処理します。ExpenseSubmission ストアド プロシージャは、キュー上で EndDialog メッセージを検出すると、メッセージ交換を終了します。

  • 費用が承認された場合、ProcessExpense サービスは、費用の支払いが実行されたことを確認する ReimbursementIssued メッセージを作成、送信し、メッセージ交換を終了します。Service Broker は、これらのメッセージを該当するサービスのキューに格納します。キューは、ExpenseSubmission プロシージャをアクティブ化し、このプロシージャが ReimbursementIssued メッセージを処理します。このプロシージャは、次に EndDialog メッセージを処理し、メッセージ交換を終了します。