次の方法で共有


レッスン 2 : メッセージ交換の開始とメッセージの送信

適用対象: 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: メッセージ交換オブジェクトのドロップ」を参照してください。

関連項目