レッスン 2: 内部アクティブ化プロシージャの作成

このレッスンでは、Service Broker キューからのメッセージを処理するストアド プロシージャを作成する方法を学習します。また、メッセージがキューに入るたびにプロシージャがアクティブ化されるように指定する方法も学習します。

手順

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

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

    USE AdventureWorks;
    GO
    

内部アクティブ化ストアド プロシージャの作成

  • 次のコードをコピーし、クエリ エディタ ウィンドウに貼り付けます。次に、コードを実行してストアド プロシージャを作成します。実行すると、ストアド プロシージャは、キュー内にメッセージがある間はメッセージの受信を続けます。メッセージを返さずに受信がタイムアウトすると、ストアド プロシージャは終了します。受信したメッセージが要求メッセージだった場合は、ストアド プロシージャによって応答メッセージが返されます。受信したメッセージが EndDialog メッセージの場合は、ストアド プロシージャによって発信先でのメッセージ交換が終了します。受信したメッセージが Error メッセージの場合は、トランザクションがロールバックされます。

    CREATE PROCEDURE TargetActivProc
    AS
      DECLARE @RecvReqDlgHandle UNIQUEIDENTIFIER;
      DECLARE @RecvReqMsg NVARCHAR(100);
      DECLARE @RecvReqMsgName sysname;
    
      WHILE (1=1)
      BEGIN
    
        BEGIN TRANSACTION;
    
        WAITFOR
        ( RECEIVE TOP(1)
            @RecvReqDlgHandle = conversation_handle,
            @RecvReqMsg = message_body,
            @RecvReqMsgName = message_type_name
          FROM TargetQueueIntAct
        ), TIMEOUT 5000;
    
        IF (@@ROWCOUNT = 0)
        BEGIN
          ROLLBACK TRANSACTION;
          BREAK;
        END
    
        IF @RecvReqMsgName =
           N'//AWDB/InternalAct/RequestMessage'
        BEGIN
           DECLARE @ReplyMsg NVARCHAR(100);
           SELECT @ReplyMsg =
           N'<ReplyMsg>Message for Initiator service.</ReplyMsg>';
    
           SEND ON CONVERSATION @RecvReqDlgHandle
                  MESSAGE TYPE 
                  [//AWDB/InternalAct/ReplyMessage]
                  (@ReplyMsg);
        END
        ELSE IF @RecvReqMsgName =
            N'https://schemas.microsoft.com/SQL/ServiceBroker/EndDialog'
        BEGIN
           END CONVERSATION @RecvReqDlgHandle;
        END
        ELSE IF @RecvReqMsgName =
            N'https://schemas.microsoft.com/SQL/ServiceBroker/Error'
        BEGIN
           END CONVERSATION @RecvReqDlgHandle;
        END
    
        COMMIT TRANSACTION;
    
      END
    GO
    

内部アクティブ化を指定するための発信先キューの変更

  • 次のコードをコピーし、クエリ エディタ ウィンドウに貼り付けます。次にコードを実行し、Service Broker で TargetActiveProc ストアド プロシージャをアクティブ化して TargetQueueIntAct からのメッセージを処理するように指定します。Service Broker では、TargetQueueIntAct でメッセージを受信したときに、TargetActiveProc のコピーがまだ実行されていない場合は、必ずこのプロシージャのコピーが実行されます。既存のコピーが着信するメッセージの数に対応できなくなるたびに、Service Broker では TargetActiveProc のコピーが追加で実行されます。

    ALTER QUEUE TargetQueueIntAct
        WITH ACTIVATION
        ( STATUS = ON,
          PROCEDURE_NAME = TargetActivProc,
          MAX_QUEUE_READERS = 10,
          EXECUTE AS SELF
        );
    GO
    

次の手順

これで、//AWDB/InternalAct/InitiatorService//AWDB/InternalAct/TargetService の間のメッセージ交換をサポートするように AdventureWorks を適切に構成できました。次に、この構成を使用するメッセージ交換を完成させます。「レッスン 3 : メッセージ交換の開始とメッセージの送信」を参照してください。