レッスン 3 : メッセージ交換の開始とメッセージの送信
このレッスンでは、内部アクティブ化ストアド プロシージャによって構成されたシステムで、簡単な要求/応答メッセージ サイクルを実行する方法を学習します。
手順
AdventureWorks2008R2 データベースへの切り替え
次のコードをコピーし、クエリ エディター ウィンドウに貼り付けます。次にこのコードを実行し、コンテキストを AdventureWorks2008R2 データベースに切り替えます。
USE AdventureWorks2008R2; GO
メッセージ交換の開始と要求メッセージの送信
次のコードをコピーし、クエリ エディター ウィンドウに貼り付けます。次にこのコードを実行し、メッセージ交換を開始して、//AWDB/InternalAct/TargetService に要求メッセージを送信します。BEGIN DIALOG から SEND ステートメントにダイアログ ハンドルを渡すために変数を使用するため、このコードは 1 つのブロック内で実行する必要があります。このバッチは、BEGIN DIALOG ステートメントを実行してメッセージ交換を開始します。要求メッセージを作成し、SEND ステートメントでダイアログ ハンドルを使用して、そのメッセージ交換で要求メッセージを送信します。最後の SELECT ステートメントは、送信されたメッセージのテキストを表示します。
DECLARE @InitDlgHandle UNIQUEIDENTIFIER; DECLARE @RequestMsg NVARCHAR(100); BEGIN TRANSACTION; BEGIN DIALOG @InitDlgHandle FROM SERVICE [//AWDB/InternalAct/InitiatorService] TO SERVICE N'//AWDB/InternalAct/TargetService' ON CONTRACT [//AWDB/InternalAct/SampleContract] WITH ENCRYPTION = OFF; -- Send a message on the conversation SELECT @RequestMsg = N'<RequestMsg>Message for Target service.</RequestMsg>'; SEND ON CONVERSATION @InitDlgHandle MESSAGE TYPE [//AWDB/InternalAct/RequestMessage] (@RequestMsg); -- Diplay sent request. SELECT @RequestMsg AS SentRequestMsg; COMMIT TRANSACTION; GO
要求の受信と応答の送信
- 要求メッセージを送信すると、Service Broker では、TargetActiveProc のコピーが自動的にアクティブ化されます。ストアド プロシージャは TargetQueueIntAct から応答メッセージを受信して、発信側に応答メッセージを返信します。
応答の受信とメッセージ交換の終了
次のコードをコピーし、クエリ エディター ウィンドウに貼り付けます。次にこのコードを実行し、応答メッセージを受信してメッセージ交換を終了します。RECEIVE ステートメントは、InitiatorQueueIntAct から応答メッセージを取得します。END CONVERSATION ステートメントは、発信側でのメッセージ交換を終了し、発信先サービスに EndDialog メッセージを送信します。最後の SELECT ステートメントは応答メッセージのテキストを表示します。これにより、そのメッセージが前の手順で送信したメッセージと同じであるかどうかを確認できます。
DECLARE @RecvReplyMsg NVARCHAR(100); DECLARE @RecvReplyDlgHandle UNIQUEIDENTIFIER; BEGIN TRANSACTION; WAITFOR ( RECEIVE TOP(1) @RecvReplyDlgHandle = conversation_handle, @RecvReplyMsg = message_body FROM InitiatorQueueIntAct ), TIMEOUT 5000; END CONVERSATION @RecvReplyDlgHandle; -- Display recieved request. SELECT @RecvReplyMsg AS ReceivedReplyMsg; COMMIT TRANSACTION; GO
発信先でのメッセージ交換の終了
- 発信側に対して END CONVERSATION ステートメントを実行すると、Service Broker によって、EndDialog メッセージが TargetQueueIntAct キューに送信されます。TargetActiveProc プロシージャは、EndDialog メッセージを受信して、発信先でのメッセージ交換を終了する END CONVERSATION ステートメントを発行します。
次の手順
ここでは、//AWDB/InternalAct/InitiatorService と //AWDB/InternalAct/TargetService の間で要求/応答メッセージ サイクルを実行しました。このレッスンの手順を必要なだけ繰り返して、メッセージの要求と応答のペアを転送することができます。SEND ステートメントと REPLY ステートメントを調べ終わったら、メッセージ交換で使用されたすべてのオブジェクトを削除できます。詳細については、「レッスン 4 : メッセージ交換オブジェクトの削除」を参照してください。