レッスン 2 : メッセージ交換の開始とメッセージの送信
新規 : 2007 年 9 月 15 日
このレッスンでは、メッセージ交換を開始して、単純な要求/応答メッセージ サイクルを実行した後、メッセージ交換を終了する方法を学習します。
手順
AdventureWorks データベースへの切り替え
クエリ エディタ ウィンドウに、次のコードをコピーして貼り付けます。次に、このコードを実行して、コンテキストを AdventureWorks データベースに切り替えます。
USE AdventureWorks; 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
要求の受信と応答の送信
クエリ エディタ ウィンドウに、次のコードをコピーして貼り付けます。次に、このコードを実行して、TargetQueue2DB から応答メッセージを受信し、応答メッセージを発信側に送信します。RECEIVE ステートメントは、要求メッセージを取得します。後続の SELECT ステートメントによりテキストが表示されます、これにより、このテキストが前の手順で送信されたものと同じメッセージであることを確認できます。IF ステートメントにより、受信したメッセージが要求メッセージ型であるかどうか、および応答メッセージを発信側に送信するときに SEND ステートメントが使用されるかどうかを調べます。END CONVERSATION ステートメントは、メッセージ交換の相手側を終了するために使用します。最後の SELECT ステートメントは、応答メッセージのテキストを表示します。
DECLARE @RecvReqDlgHandle UNIQUEIDENTIFIER; DECLARE @RecvReqMsg NVARCHAR(100); DECLARE @RecvReqMsgName sysname; BEGIN TRANSACTION; RECEIVE TOP(1) @RecvReqDlgHandle = conversation_handle, @RecvReqMsg = message_body, @RecvReqMsgName = message_type_name FROM TargetQueue1DB; 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 ステートメントにより、InitiatorQueue2DB から応答メッセージを取得します。END CONVERSATION ステートメントにより、メッセージ交換の発信側を終了します。最後の SELECT ステートメントにより、応答メッセージのテキストが表示されます。これにより、このメッセージが前の手順で送信されたものと同じであることを確認できます。
DECLARE @RecvReplyMsg NVARCHAR(100); DECLARE @RecvReplyDlgHandle UNIQUEIDENTIFIER; BEGIN TRANSACTION; RECEIVE TOP(1) @RecvReplyDlgHandle = conversation_handle, @RecvReplyMsg = message_body FROM InitiatorQueue1DB; END CONVERSATION @RecvReplyDlgHandle; SELECT @RecvReplyMsg AS ReceivedReplyMsg; COMMIT TRANSACTION; GO
次の手順
これで、//AWDB/1DBSample/InitiatorService と //AWDB/1DBSample/TargetService の間の要求/応答メッセージ サイクルが正常に実行されました。要求/応答のメッセージのペアを送信する回数だけ、このレッスンの手順を繰り返し実行します。SEND ステートメントと REPLY ステートメントを調べ終わったら、メッセージ交換に使用されたオブジェクトをすべて削除できます。詳細については、「レッスン 3 : メッセージ交換オブジェクトの削除」を参照してください。
参照
その他の技術情報
BEGIN DIALOG CONVERSATION (Transact-SQL)
SEND (Transact-SQL)
RECEIVE (Transact-SQL)
END CONVERSATION (Transact-SQL)
Service Broker のプログラミングの基礎