Lección 2: crear un procedimiento de activación interna
En esta lección, aprenderá a crear un procedimiento almacenado para procesar los mensajes de una cola de Service Broker. También aprenderá a especificar que el procedimiento debe activarse en cuanto haya mensajes en la cola.
Procedimientos
Cambiar a la base de datos AdventureWorks2008R2
Copie y pegue el código siguiente en una ventana del Editor de consultas. Después, ejecútelo para cambiar el contexto a la base de datos AdventureWorks2008R2.
USE AdventureWorks2008R2; GO
Crear un procedimiento almacenado de activación interna
Copie y pegue el código siguiente en una ventana del Editor de consultas. A continuación, ejecútelo para crear un procedimiento almacenado. Al ejecutarlo, el procedimiento almacenado sigue recibiendo mensajes mientras los haya en la cola. Si se agota el tiempo de espera para la recepción sin devolver un mensaje, el procedimiento almacenado finaliza. Si el mensaje recibido es un mensaje de solicitud, el procedimiento almacenado devuelve un mensaje de respuesta. Si el mensaje recibido es un mensaje EndDialog, el procedimiento almacenado finaliza la conversación en el lado de destino. Si el mensaje recibido es un mensaje Error, revierte la transacción.
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
Modificar la cola de destino para especificar la activación interna
Copie y pegue el código siguiente en una ventana del Editor de consultas. A continuación, ejecútelo para indicar a Service Broker que active el procedimiento almacenado TargetActiveProc para procesar los mensajes procedentes de TargetQueueIntAct. Service Broker ejecutará una copia de TargetActiveProc cada vez que se reciba un mensaje en TargetQueueIntAct y no se esté ejecutando ninguna copia del procedimiento. Service Broker ejecutará copias adicionales de TargetActiveProc siempre que las copias existentes no sean capaces de hacer frente al número de mensajes entrantes.
ALTER QUEUE TargetQueueIntAct WITH ACTIVATION ( STATUS = ON, PROCEDURE_NAME = TargetActivProc, MAX_QUEUE_READERS = 10, EXECUTE AS SELF ); GO
Pasos siguientes
Ha configurado correctamente AdventureWorks2008R2 para que admita una conversación entre //AWDB/InternalAct/InitiatorService y //AWDB/InternalAct/TargetService. A continuación, completará una conversación usando esta configuración. Vea Lección 3: comenzar una conversación y transmitir mensajes.
Vea también