Lição 2: Criando um procedimento de ativação interna

Nesta lição, você aprenderá a criar um procedimento armazenado para processar mensagens de uma fila do Service Broker. Também aprenderá a especificar que o procedimento seja ativado a qualquer momento em que haja mensagens na fila.

Procedimentos

Alternar para o banco de dados AdventureWorks

  • Copie e cole o código a seguir em uma janela do Editor de Consultas. Em seguida, execute-o para alternar o contexto para o banco de dados AdventureWorks.

    USE AdventureWorks;
    GO
    

Crie um procedimento armazenado de ativação

  • Copie e cole o código a seguir em uma janela do Editor de Consultas. Em seguida, execute-o para criar um procedimento armazenado. Quando executado, o procedimento armazenado mantém o recebimento mensagens enquanto há mensagens na fila. Se o tempo limite de recebimentos for alcançado sem retornar uma mensagem, o procedimento armazenado terminará. Se a mensagem recebida era uma mensagem de solicitação, o procedimento armazenado retornará uma mensagem de resposta. Se a mensagem recebida é uma mensagem EndDialog, o procedimento armazenado terminará o lado de destino da conversação. Se a mensagem recebida for uma mensagem de Erro, a transação será revertida.

    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
    

Altere a fila de destino para especificar ativação interna

  • Copie e cole o código a seguir em uma janela do Editor de Consultas. Em seguida, execute-o para especificar que o Service Broker ative o procedimento armazenado TargetActiveProc para processar mensagens de TargetQueueIntAct. O Service Broker executará uma cópia de TargetActiveProc a qualquer momento em que uma mensagem seja recebida em TargetQueueIntAct e nenhuma cópia do procedimento esteja em execução. O Service Broker executará cópias adicionais de TargetActiveProc sempre que as cópias existentes não acompanharem o número de mensagens de entrada.

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

Próximas etapas

Você configurou com êxito o AdventureWorks para oferecer suporte a uma conversação entre o //AWDB/InternalAct/InitiatorService e o //AWDB/InternalAct/TargetService. Em seguida, você concluirá uma conversação usando essa configuração. Consulte Lição 3: Começando uma conversação e transmitindo mensagens.