Compartilhar via


Lição 3: Começando uma conversação e transmitindo mensagens

Nesta lição, você aprenderá a concluir um ciclo de mensagem de resposta de solicitação simples em um sistema configurado com um procedimento armazenado de ativação interna.

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 para o contexto do banco de dados AdventureWorks.

    USE AdventureWorks;
    GO
    

Começar uma conversação e enviar uma mensagem de solicitação

  • Copie e cole o código a seguir em uma janela do Editor de Consultas. Em seguida, execute-o para iniciar uma conversação e enviar uma mensagem de solicitação para o //AWDB/InternalAct/TargetService. O código precisará ser executado em bloco único porque há uma variável que é usada para passar um identificador de caixa de diálogo da instrução BEGIN DIALOG para a instrução SEND. O lote executa a instrução BEGIN DIALOG para iniciar a conversação. Ele cria uma mensagem de solicitação e depois usa o identificador de caixa de diálogo em uma instrução SEND para enviar a mensagem de solicitação nessa conversação. A última instrução SELECT exibe o texto da mensagem enviada.

    DECLARE @InitDlgHandle UNIQUEIDENTIFIER;
    DECLARE @RequestMsg NVARCHAR(100);
    
    BEGIN TRANSACTION;
    
    BEGIN DIALOG @InitDlgHandle
         FROM SERVICE
          [//AWDB/InternalAct/InitiatorService]
         TO SERVICE
          N'//AWDB/InternalAct/TargetService'
         ON CONTRACT
          [//AWDB/InternalAct/SampleContract]
         WITH
             ENCRYPTION = OFF;
    
    -- Send a message on the conversation
    SELECT @RequestMsg =
           N'<RequestMsg>Message for Target service.</RequestMsg>';
    
    SEND ON CONVERSATION @InitDlgHandle
         MESSAGE TYPE 
         [//AWDB/InternalAct/RequestMessage]
         (@RequestMsg);
    
    -- Diplay sent request.
    SELECT @RequestMsg AS SentRequestMsg;
    
    COMMIT TRANSACTION;
    GO
    

Receber a solicitação e enviar uma resposta

  • Quando você envia a mensagem de solicitação, o Service Broker ativa uma cópia de TargetActiveProc automaticamente. O procedimento armazenado recebe a mensagem de resposta de TargetQueueIntAct e a envia de volta ao iniciador.

Receber a resposta e terminar a conversação

  • Copie e cole o código a seguir em uma janela do Editor de Consultas. Em seguida, execute-o para receber a mensagem de resposta e terminar a conversação. A instrução RECEIVE recupera a mensagem de resposta de InitiatorQueueIntAct. A instrução END CONVERSATION termina o lado do iniciador da conversação e envia uma mensagem EndDialog ao serviço de destino. A última instrução SELECT exibe o texto da mensagem de resposta, de modo que você poderá confirmar se ela é a mesma enviada na etapa anterior.

    DECLARE @RecvReplyMsg NVARCHAR(100);
    DECLARE @RecvReplyDlgHandle UNIQUEIDENTIFIER;
    
    BEGIN TRANSACTION;
    
    WAITFOR
    ( RECEIVE TOP(1)
        @RecvReplyDlgHandle = conversation_handle,
        @RecvReplyMsg = message_body
        FROM InitiatorQueueIntAct
    ), TIMEOUT 5000;
    
    END CONVERSATION @RecvReplyDlgHandle;
    
    -- Display recieved request.
    SELECT @RecvReplyMsg AS ReceivedReplyMsg;
    
    COMMIT TRANSACTION;
    GO
    

Termine o lado de destino da conversação.

  • Quando você executa a instrução END CONVERSATION para o iniciador, o Service Broker envia uma mensagem EndDialog à fila TargetQueueIntAct. O procedimento TargetActiveProc recebe a mensagem EndDialog e emite uma END CONVERSATION que termina o lado de destino da conversação.

Próximas etapas

Você concluiu com êxito um ciclo de mensagem de solicitação-resposta entre o //AWDB/InternalAct/InitiatorService e o //AWDB/InternalAct/TargetService. Essa lição poderá ser repetida o quanto for necessário para transmitir um par de mensagens de solicitação-resposta. Quando você terminar de investigar as instruções SEND e REPLY, descarte todos os objetos que foram usados pela conversação. Para obter mais informações, consulte Lição 4: Descartando os objetos de conversação.