適用対象: SQL Server
Azure SQL Managed Instance
このレッスンでは、メッセージ交換を開始し、簡単な要求/応答メッセージ サイクルを完了し、メッセージ交換を終了する方法を学習します。
手順
Note
サンプルは、SQL Server 2008 R2 (10.50.x) で妥当性確認済みです。 AdventureWorks サンプル データベースの AdventureWorks2008R2
サンプル データベースを使用して、サンプルを入力することをお勧めします。
SQL Server Service Broker は、現在のバージョンの SQL Server でサポートされています。
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 と the //AWDB/1DBSample/TargetService の間で要求と返答のメッセージ サイクルを正常に完了しました。 このレッスンの手順を必要なだけ繰り返して、メッセージの要求と応答のペアを転送することができます。 SEND ステートメントと REPLY ステートメントを調べ終わったら、メッセージ交換で使用されたすべてのオブジェクトを削除できます。 詳細については、「レッスン 3: メッセージ交換オブジェクトのドロップ」を参照してください。