Share via


Lección 2: Comenzar una conversación y transmitir mensajes

En esta lección, aprenderá a iniciar una conversación, completar un ciclo de mensajes de solicitud y respuesta, y a continuación finalizar la conversación.

Procedimientos

Cambiar a la base de datos AdventureWorks

  • Copie y pegue el código siguiente en una ventana del Editor de consultas. Después, ejecútelo para cambiar el contexto a la base de datos AdventureWorks.

    USE AdventureWorks;
    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. A continuación, ejecútelo para iniciar una conversación y enviar un mensaje de solicitud al //AWDB/1DBSample/TargetService. El código se debe ejecutar en un bloque debido a que se usa una variable para pasar un identificador de diálogo desde BEGIN DIALOG a la instrucción SEND. El lote ejecuta la instrucción BEGIN DIALOG para iniciar la conversación. Genera un mensaje de solicitud y, a continuación, usa el identificador de diálogo en una instrucción SEND para enviar el mensaje de solicitud en esa conversación. La última instrucción SELECT muestra el texto del mensaje que se envió.

    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
    

Recibir una solicitud y enviar una respuesta

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

    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
    

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 instrucción RECEIVE recupera el mensaje de respuesta de la InitiatorQueue1DB. La instrucción END CONVERSATION finaliza el lado del iniciador de la conversación. La última instrucción SELECT muestra el texto del mensaje de respuesta para que pueda confirmar que es el mismo que se envió en el paso 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
    

Pasos siguientes

Ha completado correctamente un ciclo de mensajes de solicitud y respuesta entre //AWDB/1DBSample/InitiatorService y //AWDB/1DBSample/TargetService. Puede repetir los pasos de esta lección tantas veces como desee para transmitir el par de mensajes de solicitud y respuesta. Cuando haya terminado de investigar las instrucciones SEND y REPLY, puede quitar todos los objetos que se usaron en la conversación. Para obtener más información, vea Lección 3: Quitar los objetos de conversación.