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

このレッスンでは、データベース エンジンの同じインスタンス内にある 2 つのデータベースにまたがるメッセージ交換を開始する方法を学習します。また、簡単な要求/応答メッセージ サイクルを完了し、メッセージ交換を終了する方法も学習します。

手順

InitiatorDB データベースへの切り替え

  • 次のコードをコピーし、クエリ エディタ ウィンドウに貼り付けます。次にこのコードを実行し、メッセージ交換を開始する InitiatorDB データベースにコンテキストを切り替えます。

    USE InitiatorDB;
    GO
    

メッセージ交換の開始と要求メッセージの送信

  • 次のコードをコピーし、クエリ エディタ ウィンドウに貼り付けます。次にこのコードを実行し、メッセージ交換を開始して、TargetDB 内の //TgtDB/2DBSample/TargetService に要求メッセージを送信します。BEGIN DIALOG から SEND ステートメントにダイアログ ハンドルを渡すために変数を使用するため、このコードは 1 つのブロック内で実行する必要があります。このバッチは、BEGIN DIALOG ステートメントを実行してメッセージ交換を開始し、要求メッセージを作成します。次に、SEND ステートメントでダイアログ ハンドルを使用して、そのメッセージ交換で要求メッセージを送信します。最後の SELECT ステートメントは、送信されたメッセージのテキストを表示します。

    DECLARE @InitDlgHandle UNIQUEIDENTIFIER;
    DECLARE @RequestMsg NVARCHAR(100);
    
    BEGIN TRANSACTION;
    
    BEGIN DIALOG @InitDlgHandle
         FROM SERVICE [//InitDB/2DBSample/InitiatorService]
         TO SERVICE N'//TgtDB/2DBSample/TargetService'
         ON CONTRACT [//BothDB/2DBSample/SimpleContract]
         WITH
             ENCRYPTION = OFF;
    
    SELECT @RequestMsg =
       N'<RequestMsg>Message for Target service.</RequestMsg>';
    
    SEND ON CONVERSATION @InitDlgHandle
         MESSAGE TYPE [//BothDB/2DBSample/RequestMessage]
          (@RequestMsg);
    
    SELECT @RequestMsg AS SentRequestMsg;
    
    COMMIT TRANSACTION;
    GO
    

TargetDB データベースへの切り替え

  • 次のコードをコピーし、クエリ エディタ ウィンドウに貼り付けます。次にこのコードを実行し、コンテキストを TargetDB データベースに切り替えます。このデータベースで要求メッセージを受信し、応答メッセージを InitiatorDB に返信します。

    USE TargetDB;
    GO
    

要求の受信と応答の送信

  • 次のコードをコピーし、クエリ エディタ ウィンドウに貼り付けます。次にこのコードを実行し、TargetQueue2DB から応答メッセージを受信して、発信側に応答メッセージを返信します。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 TargetQueue2DB
    ), TIMEOUT 1000;
    
    SELECT @RecvReqMsg AS ReceivedRequestMsg;
    
    IF @RecvReqMsgName =
       N'//BothDB/2DBSample/RequestMessage'
    BEGIN
         DECLARE @ReplyMsg NVARCHAR(100);
         SELECT @ReplyMsg =
            N'<ReplyMsg>Message for Initiator service.</ReplyMsg>';
    
         SEND ON CONVERSATION @RecvReqDlgHandle
              MESSAGE TYPE
                [//BothDB/2DBSample/ReplyMessage] (@ReplyMsg);
    
         END CONVERSATION @RecvReqDlgHandle;
    END
    
    SELECT @ReplyMsg AS SentReplyMsg;
    
    COMMIT TRANSACTION;
    GO
    

InitiatorDB データベースへの切り替え

  • 次のコードをコピーし、クエリ エディタ ウィンドウに貼り付けます。次にこのコードを実行し、コンテキストを InitiatorDB データベースに戻します。このデータベースで応答メッセージを受信し、メッセージ交換を終了します。

    USE InitiatorDB;
    GO
    

応答の受信とメッセージ交換の終了

  • 次のコードをコピーし、クエリ エディタ ウィンドウに貼り付けます。次にこのコードを実行し、応答メッセージを受信してメッセージ交換を終了します。RECEIVE ステートメントは、InitiatorQueue2DB から応答メッセージを取得します。END CONVERSATION ステートメントは、発信側でのメッセージ交換を終了します。最後の SELECT ステートメントは、応答メッセージのテキストを表示し、そのメッセージが前の手順で送信したメッセージと同じであることを確認できるようにします。

    DECLARE @RecvReplyMsg NVARCHAR(100);
    DECLARE @RecvReplyDlgHandle UNIQUEIDENTIFIER;
    
    BEGIN TRANSACTION;
    
    WAITFOR
    ( RECEIVE TOP(1)
        @RecvReplyDlgHandle = conversation_handle,
        @RecvReplyMsg = message_body
      FROM InitiatorQueue2DB
    ), TIMEOUT 1000;
    
    END CONVERSATION @RecvReplyDlgHandle;
    
    -- Display recieved request.
    SELECT @RecvReplyMsg AS ReceivedReplyMsg;
    
    COMMIT TRANSACTION;
    GO
    

次の手順

これでチュートリアルは終わりです。チュートリアルは、概要の紹介を目的としています。使用可能なすべてのオプションについて説明しているわけではありません。チュートリアルでは、ロジックやエラー処理を単純化しているため、実稼働環境では使用しないでください。効率的で信頼度の高い、堅牢なメッセージ交換を行うには、このチュートリアルに例示されているコードよりも複雑なコードが必要になります。

Service Broker チュートリアルに戻る

Service Broker チュートリアル