レッスン 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 : メッセージ交換の開始とメッセージの送信」を参照してください。