レッスン 2 : メッセージ交換の開始とメッセージの送信
このレッスンでは、メッセージ交換を開始し、簡単な要求/応答メッセージ サイクルを完了し、メッセージ交換を終了する方法を学習します。
手順
AdventureWorks2008R2 データベースへの切り替え
次のコードをコピーし、クエリ エディター ウィンドウに貼り付けます。次にこのコードを実行し、コンテキストを AdventureWorks2008R2 データベースに切り替えます。
USE AdventureWorks2008R2; GO
メッセージ交換の開始と要求メッセージの送信
次のコードをコピーし、クエリ エディター ウィンドウに貼り付けます。次にこのコードを実行し、メッセージ交換を開始して、//AWDB/1DBSample/TargetService に要求メッセージを送信します。BEGIN DIALOG から SEND ステートメントにダイアログ ハンドルを渡すために変数を使用するため、このコードは 1 つのブロック内で実行する必要があります。このバッチは、BEGIN DIALOG ステートメントを実行してメッセージ交換を開始します。要求メッセージを作成し、SEND ステートメントでダイアログ ハンドルを使用して、そのメッセージ交換で要求メッセージを送信します。最後の SELECT ステートメントは、送信されたメッセージのテキストを表示します。
DECLARE @InitDlgHandle UNIQUEIDENTIFIER; DECLARE @RequestMsg NVARCHAR(100); BEGIN TRANSACTION; BEGIN DIALOG @InitDlgHandle FROM SERVICE [//AWDB/1DBSample/InitiatorService] TO SERVICE N'//AWDB/1DBSample/TargetService' ON CONTRACT [//AWDB/1DBSample/SampleContract] WITH ENCRYPTION = OFF; SELECT @RequestMsg = N'<RequestMsg>Message for Target service.</RequestMsg>'; SEND ON CONVERSATION @InitDlgHandle MESSAGE TYPE [//AWDB/1DBSample/RequestMessage] (@RequestMsg); SELECT @RequestMsg AS SentRequestMsg; COMMIT TRANSACTION; GO
要求の受信と応答の送信
次のコードをコピーし、クエリ エディター ウィンドウに貼り付けます。次にこのコードを実行し、TargetQueue1DB から応答メッセージを受信して、発信側に応答メッセージを返信します。RECEIVE ステートメントは要求メッセージを取得します。次の SELECT ステートメントはテキストを表示し、前の手順で送信したメッセージと同じメッセージであることを確認できるようにします。IF ステートメントは、受信したメッセージが要求メッセージ型であるかどうか、および応答メッセージを発信側に返信するために SEND ステートメントを使用するかどうかをテストします。発信先でのメッセージ交換を終了するには、END CONVERSATION ステートメントを使用します。最後の SELECT ステートメントは、応答メッセージのテキストを表示します。
DECLARE @RecvReqDlgHandle UNIQUEIDENTIFIER; DECLARE @RecvReqMsg NVARCHAR(100); DECLARE @RecvReqMsgName sysname; BEGIN TRANSACTION; WAITFOR ( RECEIVE TOP(1) @RecvReqDlgHandle = conversation_handle, @RecvReqMsg = message_body, @RecvReqMsgName = message_type_name FROM TargetQueue1DB ), TIMEOUT 1000; SELECT @RecvReqMsg AS ReceivedRequestMsg; IF @RecvReqMsgName = N'//AWDB/1DBSample/RequestMessage' BEGIN DECLARE @ReplyMsg NVARCHAR(100); SELECT @ReplyMsg = N'<ReplyMsg>Message for Initiator service.</ReplyMsg>'; SEND ON CONVERSATION @RecvReqDlgHandle MESSAGE TYPE [//AWDB/1DBSample/ReplyMessage] (@ReplyMsg); END CONVERSATION @RecvReqDlgHandle; END SELECT @ReplyMsg AS SentReplyMsg; COMMIT TRANSACTION; GO
応答の受信とメッセージ交換の終了
次のコードをコピーし、クエリ エディター ウィンドウに貼り付けます。次にこのコードを実行し、応答メッセージを受信してメッセージ交換を終了します。RECEIVE ステートメントは、InitiatorQueue1DB から応答メッセージを取得します。END CONVERSATION ステートメントは、発信側でのメッセージ交換を終了します。最後の SELECT ステートメントは、応答メッセージのテキストを表示し、そのメッセージが前の手順で送信したメッセージと同じであることを確認できるようにします。
DECLARE @RecvReplyMsg NVARCHAR(100); DECLARE @RecvReplyDlgHandle UNIQUEIDENTIFIER; BEGIN TRANSACTION; WAITFOR ( RECEIVE TOP(1) @RecvReplyDlgHandle = conversation_handle, @RecvReplyMsg = message_body FROM InitiatorQueue1DB ), TIMEOUT 1000; END CONVERSATION @RecvReplyDlgHandle; SELECT @RecvReplyMsg AS ReceivedReplyMsg; COMMIT TRANSACTION; GO
次の手順
ここでは、//AWDB/1DBSample/InitiatorService と //AWDB/1DBSample/TargetService の間で要求/応答メッセージ サイクルを完了しました。このレッスンの手順を必要なだけ繰り返して、メッセージの要求と応答のペアを転送することができます。SEND ステートメントと REPLY ステートメントを調べ終わったら、メッセージ交換で使用されたすべてのオブジェクトを削除できます。詳細については、「レッスン 3 : メッセージ交換オブジェクトの削除」を参照してください。