Lição 2: Iniciar uma conversa e transmitir mensagens

Aplica-se a:SQL ServerAzure SQL Managed Instance

Nesta lição, você aprende a iniciar uma conversa, concluir um ciclo simples de mensagens de solicitação-resposta e, em seguida, encerrar a conversa.

Procedimentos

Observação

Os exemplos de código neste artigo foram testados usando o banco de dados de exemplo AdventureWorks2025, que pode ser descarregado da página inicial de Microsoft SQL Server Samples and Community Projects.

Alternar para o banco de dados AdventureWorks2008R2

  • Copie e cole o código a seguir em uma janela do Editor de Consultas e 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, execute-o para iniciar uma conversa e enviar uma mensagem de solicitação para o AWDB/1DBSample/TargetService. Você deve executar o código em um bloco porque uma variável é usada para passar um identificador de diálogo de BEGIN DIALOG para a SEND instrução. O lote executa a BEGIN DIALOG instrução para iniciar a conversa. Ele cria uma mensagem de solicitação e, em seguida, usa o identificador de diálogo em uma SEND instrução para enviar a mensagem de solicitação nessa conversa. A última SELECT instrução exibe o texto da mensagem que foi enviada.

    DECLARE @InitDlgHandle AS UNIQUEIDENTIFIER;
    DECLARE @RequestMsg AS 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
    

Receba o pedido e envie uma resposta

  • Copie e cole o código a seguir em uma janela do Editor de Consultas, execute-o para receber a mensagem de resposta do TargetQueue1DB e envie uma mensagem de resposta de volta para o iniciador. A RECEIVE instrução recupera a mensagem de solicitação. A instrução a seguir SELECT exibe o texto para que você possa verificar se é a mesma mensagem enviada na última etapa. A IF instrução testa se a mensagem recebida é um tipo de mensagem de solicitação e se uma SEND instrução é usada para enviar uma mensagem de resposta de volta ao iniciador. A END CONVERSATION declaração é usada para encerrar o lado alvo da conversa. A declaração final SELECT exibe o texto da mensagem de resposta.

    DECLARE @RecvReqDlgHandle AS UNIQUEIDENTIFIER;
    DECLARE @RecvReqMsg AS NVARCHAR (100);
    DECLARE @RecvReqMsgName AS 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 AS 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
    

Receba a resposta e termine a conversa

  • Copie e cole o código a seguir em uma janela do Editor de Consultas e, em seguida, execute-o para receber a mensagem de resposta e encerrar a conversa. A RECEIVE instrução recupera a mensagem de resposta do InitiatorQueue1DB. A END CONVERSATION declaração encerra o lado iniciador da conversa. A última SELECT instrução exibe o texto da mensagem de resposta para que você possa confirmar que é o mesmo que foi enviado na etapa anterior.

    DECLARE @RecvReplyMsg AS NVARCHAR (100);
    DECLARE @RecvReplyDlgHandle AS 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óximo passo

Você concluiu com êxito um ciclo de mensagens de solicitação-resposta entre o AWDB/1DBSample/InitiatorService e o AWDB/1DBSample/TargetService. Você pode repetir as etapas desta lição quantas vezes quiser transmitir um par de mensagens solicitação-resposta. Quando terminar de investigar as SEND declarações e REPLY , você pode soltar todos os objetos que foram usados pela conversa.