Compartilhar via


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

Nesta lição você aprenderá a iniciar uma conversação que se estende para dois bancos de dados na mesma instância do Mecanismo de Banco de Dados. Você também aprenderá a completar um ciclo de mensagem de solicitação-resposta, e terminar a conversação em seguida.

Procedimentos

Alternar para o banco de dados InitiatorDB

  • Copie e cole o código a seguir em uma janela do Editor de Consultas. Em seguida, execute-o para alternar de contexto para o banco de dados InitiatorDB onde a conversação se iniciará.

    USE InitiatorDB;
    GO
    

Iniciar 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. Depois, envie uma mensagem de solicitação para o //TgtDB/2DBSample/TargetService no TargetDB. 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 SEND. O lote executa a instrução BEGIN DIALOG para começar a conversação e para criar uma mensagem de solicitação. Em seguida, ele usa o identificador de caixa de diálogo em uma instrução SEND para enviar uma 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 [//InitDB/2DBSample/InitiatorService]
         TO SERVICE N'//TgtDB/2DBSample/TargetService'
         ON CONTRACT [//BothDB/2DBSample/SimpleContract]
         WITH
             ENCRYPTION = OFF;
    
    SELECT @RequestMsg =
       N'<RequestMsg>Message for Target service.</RequestMsg>';
    
    SEND ON CONVERSATION @InitDlgHandle
         MESSAGE TYPE [//BothDB/2DBSample/RequestMessage]
          (@RequestMsg);
    
    SELECT @RequestMsg AS SentRequestMsg;
    
    COMMIT TRANSACTION;
    GO
    

Alternar para o banco de dados TargetDB

  • Copie e cole o código a seguir em uma janela do Editor de Consultas. Em seguida, execute-o para alternar para o contexto para o banco de dados TargetDB, no qual a mensagem de solicitação será recebida e a mensagem de resposta será retornada para o InitiatorDB.

    USE TargetDB;
    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 TargetQueue2DB e retornar uma mensagem de resposta para o iniciador. A instrução RECEIVE recupera a mensagem de solicitação. Em seguida, a instrução SELECT seguinte exibe o texto, de modo que é possível verificar se trata da mesma mensagem enviada na etapa anterior. 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 retornar uma mensagem de resposta para o iniciador. Testa igualmente se a instrução a END CONVERSATION será usada para terminar o lado de destino da conversação. 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 TargetQueue2DB
    ), TIMEOUT 1000;
    
    SELECT @RecvReqMsg AS ReceivedRequestMsg;
    
    IF @RecvReqMsgName =
       N'//BothDB/2DBSample/RequestMessage'
    BEGIN
         DECLARE @ReplyMsg NVARCHAR(100);
         SELECT @ReplyMsg =
            N'<ReplyMsg>Message for Initiator service.</ReplyMsg>';
    
         SEND ON CONVERSATION @RecvReqDlgHandle
              MESSAGE TYPE
                [//BothDB/2DBSample/ReplyMessage] (@ReplyMsg);
    
         END CONVERSATION @RecvReqDlgHandle;
    END
    
    SELECT @ReplyMsg AS SentReplyMsg;
    
    COMMIT TRANSACTION;
    GO
    

Alternar para o banco de dados InitiatorDB

  • Copie e cole o código a seguir em uma janela do Editor de Consultas. Em seguida, execute-o para retornar o contexto para o banco de dados InitiatorDB, onde a mensagem de resposta será recebida e a conversação será terminada.

    USE InitiatorDB;
    GO
    

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 do InitiatorQueue2DB. A instrução END CONVERSATION termina o lado de iniciador da conversação. 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 InitiatorQueue2DB
    ), TIMEOUT 1000;
    
    END CONVERSATION @RecvReplyDlgHandle;
    
    -- Display recieved request.
    SELECT @RecvReplyMsg AS ReceivedReplyMsg;
    
    COMMIT TRANSACTION;
    GO
    

Próximas etapas

Isso conclui o tutorial. Os tutoriais só apenas breves apresentações. Eles não descrevem todas as opções disponíveis. Os tutoriais usam lógica simplificada e tratamento de erros e não devem ser usados em um ambiente de produção.Para criar conversações eficientes, seguras e robustas, é necessário um código mais complexo que o exemplo deste tutorial.

Retornar para os tutoriais do Agente de Serviços

Tutoriais do Service Broker