Lección 4: Iniciar una conversación y transmitir mensajes

Se aplica a:SQL ServerAzure SQL Managed Instance

En esta lección, aprenderá a iniciar una conversación que abarque dos bases de datos en la misma instancia del motor de base de datos. También aprenderá a completar un ciclo sencillo de mensajes de solicitud-respuesta y, a continuación, finalizar la conversación.

Procedimientos

Cambiar a la base de datos InitiatorDB

  • Copie y pegue el código siguiente en una ventana del Editor de consultas y, a continuación, ejecútelo para cambiar el contexto a la base de datos de InitiatorDB donde inicie la conversación.

    USE InitiatorDB;
    GO
    

Iniciar una conversación y enviar un mensaje de solicitud

  • Copie y pegue el código siguiente en una ventana del Editor de consultas y ejecútelo para iniciar una conversación y enviar un mensaje de solicitud al TgtDB/2DBSample/TargetService en TargetDB. El código debe ejecutarse en un bloque porque se usa una variable para pasar un identificador de diálogo de BEGIN DIALOG a la SEND instrucción . El lote ejecuta la BEGIN DIALOG instrucción para iniciar la conversación y crear un mensaje de solicitud. A continuación, usa el identificador de diálogo en una SEND instrucción para enviar el mensaje de solicitud en esa conversación. La última SELECT instrucción muestra el texto del mensaje que se envió.

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

Cambiar a la base de datos TargetDB

  • Copie y pegue el código siguiente en una ventana del Editor de consultas. A continuación, ejecútelo para cambiar el contexto a la TargetDB base de datos donde recibe el mensaje de solicitud y envía un mensaje de respuesta de vuelta a .InitiatorDB

    USE TargetDB;
    GO
    

Recibir la solicitud y enviar una respuesta

  • Copie y pegue el código siguiente en una ventana del Editor de consultas y ejecútelo para recibir el mensaje de respuesta de TargetQueue2DB y enviar un mensaje de respuesta al iniciador. La RECEIVE instrucción recupera el mensaje de solicitud. A continuación, la siguiente SELECT instrucción muestra el texto para que pueda comprobar que es el mismo mensaje que se envió en el paso anterior. La IF instrucción comprueba si el mensaje recibido es un tipo de mensaje de solicitud y si se usa una SEND instrucción para devolver un mensaje de respuesta al iniciador. También comprueba si la END CONVERSATION instrucción se usa para finalizar el lado de destino de la conversación. La instrucción final SELECT muestra el texto del mensaje de respuesta.

    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 TargetQueue2DB),
    TIMEOUT 1000;
    
    SELECT @RecvReqMsg AS ReceivedRequestMsg;
    
    IF @RecvReqMsgName = N'//BothDB/2DBSample/RequestMessage'
        BEGIN
            DECLARE @ReplyMsg AS 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
    

Cambiar a la base de datos InitiatorDB

  • Copie y pegue el código siguiente en una ventana del Editor de consultas. A continuación, ejecútelo para volver al contexto de la base de datos InitiatorDB, donde recibirá el mensaje de respuesta y finalizará la conversación.

    USE InitiatorDB;
    GO
    

Recibir la respuesta y finalizar la conversación

  • Copie y pegue el código siguiente en una ventana del Editor de consultas. Después, ejecútelo para recibir el mensaje de respuesta y finalizar la conversación. La RECEIVE instrucción recupera el mensaje de respuesta de InitiatorQueue2DB. La END CONVERSATION instrucción finaliza el lado iniciador de la conversación. La última SELECT instrucción muestra el texto del mensaje de respuesta para que pueda confirmar que es el mismo que lo que se envió en el paso anterior.

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