Compartilhar via


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

Nesta lição, você aprenderá a iniciar uma conversa, concluir um ciclo único de mensagem de solicitação-resposta e, em seguida, finalizar a conversa.

Procedimentos

Alternar para o banco de dados AdventureWorks2008R2

  • 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 AdventureWorks2008R2.

    USE AdventureWorks2008R2;
    GO
    

Iniciar uma conversa 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 e enviar uma mensagem de solicitação a //AWDB/1DBSample/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. 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. 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/1DBSample/InitiatorService]
         TO SERVICE
          N'//AWDB/1DBSample/TargetService'
         ON CONTRACT
          [//AWDB/1DBSample/SampleContract]
         WITH
             ENCRYPTION = OFF;
    
    SELECT @RequestMsg =
           N'<RequestMsg>Message for Target service.</RequestMsg>';
    
    SEND ON CONVERSATION @InitDlgHandle
         MESSAGE TYPE 
         [//AWDB/1DBSample/RequestMessage]
         (@RequestMsg);
    
    SELECT @RequestMsg AS SentRequestMsg;
    
    COMMIT TRANSACTION;
    GO
    

Receber a solicitação e enviar uma resposta

  • 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 do TargetQueue1DB e enviar uma mensagem de resposta para o iniciador. A instrução RECEIVE recupera a mensagem de solicitação. A instrução SELECT que segue exibe o texto para que seja possível verificar se é a mesma mensagem enviada na última etapa. A instrução IF testa se a mensagem recebida é do tipo de mensagem de solicitação e se uma instrução SEND será usada para enviar uma mensagem de resposta para o iniciador. A instrução END CONVERSATION é usada para terminar o lado de destino da conversa. A instrução SELECT final exibe o texto da mensagem de resposta.

    DECLARE @RecvReqDlgHandle UNIQUEIDENTIFIER;
    DECLARE @RecvReqMsg NVARCHAR(100);
    DECLARE @RecvReqMsgName sysname;
    
    BEGIN TRANSACTION;
    
    WAITFOR
    ( RECEIVE TOP(1)
        @RecvReqDlgHandle = conversation_handle,
        @RecvReqMsg = message_body,
        @RecvReqMsgName = message_type_name
      FROM TargetQueue1DB
    ), TIMEOUT 1000;
    
    SELECT @RecvReqMsg AS ReceivedRequestMsg;
    
    IF @RecvReqMsgName =
       N'//AWDB/1DBSample/RequestMessage'
    BEGIN
         DECLARE @ReplyMsg NVARCHAR(100);
         SELECT @ReplyMsg =
         N'<ReplyMsg>Message for Initiator service.</ReplyMsg>';
    
         SEND ON CONVERSATION @RecvReqDlgHandle
              MESSAGE TYPE 
              [//AWDB/1DBSample/ReplyMessage]
              (@ReplyMsg);
    
         END CONVERSATION @RecvReqDlgHandle;
    END
    
    SELECT @ReplyMsg AS SentReplyMsg;
    
    COMMIT TRANSACTION;
    GO
    

Receber a resposta e terminar a conversa

  • 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. A instrução RECEIVE recupera a mensagem de resposta do InitiatorQueue1DB. A instrução END CONVERSATION termina o lado de iniciador da conversa. 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 InitiatorQueue1DB
    ), TIMEOUT 1000;
    
    END CONVERSATION @RecvReplyDlgHandle;
    
    SELECT @RecvReplyMsg AS ReceivedReplyMsg;
    
    COMMIT TRANSACTION;
    GO
    

Próximas etapas

Você concluiu com êxito um ciclo de mensagem de solicitação-resposta entre o //AWDB/1DBSample/InitiatorService e o //AWDB/1DBSample/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. Para obter mais informações, consulte Lição 3: Descartando os objetos de conversa.