次の方法で共有


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

このレッスンでは、内部アクティブ化ストアド プロシージャによって構成されたシステムで、簡単な要求/応答メッセージ サイクルを実行する方法を学習します。

手順

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

  • 次のコードをコピーし、クエリ エディタ ウィンドウに貼り付けます。次にこのコードを実行し、コンテキストを AdventureWorks データベースに切り替えます。

    USE AdventureWorks;
    GO
    

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

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

    DECLARE @InitDlgHandle UNIQUEIDENTIFIER;
    DECLARE @RequestMsg NVARCHAR(100);
    
    BEGIN TRANSACTION;
    
    BEGIN DIALOG @InitDlgHandle
         FROM SERVICE
          [//AWDB/InternalAct/InitiatorService]
         TO SERVICE
          N'//AWDB/InternalAct/TargetService'
         ON CONTRACT
          [//AWDB/InternalAct/SampleContract]
         WITH
             ENCRYPTION = OFF;
    
    -- Send a message on the conversation
    SELECT @RequestMsg =
           N'<RequestMsg>Message for Target service.</RequestMsg>';
    
    SEND ON CONVERSATION @InitDlgHandle
         MESSAGE TYPE 
         [//AWDB/InternalAct/RequestMessage]
         (@RequestMsg);
    
    -- Diplay sent request.
    SELECT @RequestMsg AS SentRequestMsg;
    
    COMMIT TRANSACTION;
    GO
    

要求の受信と応答の送信

  • 要求メッセージを送信すると、Service Broker では、TargetActiveProc のコピーが自動的にアクティブ化されます。ストアド プロシージャは TargetQueueIntAct から応答メッセージを受信して、発信側に応答メッセージを返信します。

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

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

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

発信先でのメッセージ交換の終了

  • 発信側に対して END CONVERSATION ステートメントを実行すると、Service Broker によって、EndDialog メッセージが TargetQueueIntAct キューに送信されます。TargetActiveProc プロシージャは、EndDialog メッセージを受信して、発信先でのメッセージ交換を終了する END CONVERSATION ステートメントを発行します。

次の手順

ここでは、//AWDB/InternalAct/InitiatorService//AWDB/InternalAct/TargetService の間で要求/応答メッセージ サイクルを実行しました。このレッスンの手順を必要なだけ繰り返して、メッセージの要求と応答のペアを転送することができます。SEND ステートメントと REPLY ステートメントを調べ終わったら、メッセージ交換で使用されたすべてのオブジェクトを削除できます。詳細については、「レッスン 4 : メッセージ交換オブジェクトの削除」を参照してください。