Compartir a través de


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.