Lección 4: Comenzar una conversación y transmitir mensajes
En esta lección, obtendrá información sobre cómo comenzar una conversación que abarca dos bases de datos de la misma instancia de Motor de base de datos. También obtendrá información sobre cómo completar un único ciclo de mensajes de solicitud y 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. A continuación, ejecútelo para cambiar el contexto a la base de datos InitiatorDB donde iniciará 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. A continuación, ejecútelo para iniciar una conversación y enviar un mensaje de solicitud al //TgtDB/2DBSample/TargetService de la TargetDB. 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 y generar un mensaje de solicitud. Después, 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 [//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 base de datos TargetDB donde recibirá el mensaje de solicitud y enviar un mensaje de respuesta a InitiatorDB.
USE TargetDB; 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 TargetQueue2DB y enviar un mensaje de respuesta al iniciador. La instrucción RECEIVE recupera el mensaje de solicitud. Después, la siguiente instrucción SELECT muestra el texto para que pueda comprobar que es el mismo mensaje que se envió en el paso anterior. 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. También prueba si la instrucción END CONVERSATION se utiliza 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 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
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 cambiar el contexto de nuevo a la base de datos InitiatorDB donde recibirá el mensaje de solicitud 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 instrucción RECEIVE recupera el mensaje de respuesta de la InitiatorQueue2DB. 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 InitiatorQueue2DB ), TIMEOUT 1000; END CONVERSATION @RecvReplyDlgHandle; -- Display recieved request. SELECT @RecvReplyMsg AS ReceivedReplyMsg; COMMIT TRANSACTION; GO
Pasos siguientes
Esto concluye el tutorial. Los tutoriales únicamente contienen información general. No describen todas las opciones disponibles. Los tutoriales usan una lógica simplificada y un control de errores y no se deberían usar en un entorno de producción.Para crear conversaciones eficaces, confiables y robustas, necesita un código más complejo que el ejemplo de este tutorial.