次の方法で共有


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

新規 : 2007 年 9 月 15 日

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

手順

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

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

    USE InitiatorDB;
    GO
    

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

  1. クエリ エディタ ウィンドウに、次のコードをコピーして貼り付けます。次に、コードを実行してメッセージ交換を開始し、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 データベースへの切り替え

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

    USE TargetDB;
    GO
    

要求の受信と応答の送信

  1. クエリ エディタ ウィンドウに、次のコードをコピーして貼り付けます。次に、このコードを実行して、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 TargetQueue2DB;
    
    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 データベースへの切り替え

  1. クエリ エディタ ウィンドウに、次のコードをコピーして貼り付けます。次に、コードを実行して、InitiatorDB データベースにコンテキストを切り替えます。このデータベースで、要求メッセージの受信とメッセージ交換の終了を行います。

    USE InitiatorDB;
    GO
    

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

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

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

次の手順

これでチュートリアルは終わりです。チュートリアルとは概要を簡単に示すものであり、すべてのオプションについて説明しているわけではありません。基本的な操作を明確に示すために、チュートリアルでは単純なロジックとエラー処理が使用されています。効率的で信頼性が高く、堅牢なメッセージ交換を作成するには、このチュートリアルで示した例よりも複雑なコードを記述する必要があります。

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

Service Broker のチュートリアル

参照

その他の技術情報

BEGIN DIALOG CONVERSATION (Transact-SQL)
END CONVERSATION (Transact-SQL)
RECEIVE (Transact-SQL)
SEND (Transact-SQL)
WAITFOR (Transact-SQL)
Service Broker のプログラミングの基礎

ヘルプおよび情報

SQL Server 2005 の参考資料の入手