Lección 3: comenzar una conversación y transmitir mensajes
En esta lección, aprenderá a completar un ciclo de mensajes de solicitud y respuesta sencillo en un sistema configurado con un procedimiento almacenado de activación interna.
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 a //AWDB/InternalAct/TargetService. El código se debe ejecutar en un bloque debido a que se usa una variable para pasar un identificador de diálogo de 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/InternalAct/InitiatorService] TO SERVICE N'//AWDB/InternalAct/TargetService' ON CONTRACT [//AWDB/InternalAct/SampleContract] WITH ENCRYPTION = OFF; -- Send a message on the conversation SELECT @RequestMsg = N'<RequestMsg>Message for Target service.</RequestMsg>'; SEND ON CONVERSATION @InitDlgHandle MESSAGE TYPE [//AWDB/InternalAct/RequestMessage] (@RequestMsg); -- Diplay sent request. SELECT @RequestMsg AS SentRequestMsg; COMMIT TRANSACTION; GO
Recibir la solicitud y enviar una respuesta
- Cuando se envía el mensaje de solicitud, Service Broker activa automáticamente una copia de TargetActiveProc. El procedimiento almacenado recibe el mensaje de respuesta desde TargetQueueIntAct y envía un mensaje de respuesta al iniciador.
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 desde InitiatorQueueIntAct. La instrucción END CONVERSATION finaliza la conversación en el lado del iniciador y envía un mensaje EndDialog al servicio de destino. La última instrucción SELECT muestra el texto del mensaje de respuesta para que se 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 InitiatorQueueIntAct ), TIMEOUT 5000; END CONVERSATION @RecvReplyDlgHandle; -- Display recieved request. SELECT @RecvReplyMsg AS ReceivedReplyMsg; COMMIT TRANSACTION; GO
Finalizar la conversación en el lado de destino
- Cuando se ejecuta la instrucción END CONVERSATION para el iniciador, Service Broker envía un mensaje EndDialog a la cola TargetQueueIntAct. El procedimiento TargetActiveProc recibe el mensaje EndDialog y emite una instrucción END CONVERSATION que finaliza la conversación en el lado de destino.
Pasos siguientes
Ha completado correctamente un ciclo de mensajes de solicitud y respuesta entre //AWDB/InternalAct/InitiatorService y //AWDB/InternalAct/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 4: quitar los objetos de conversación.
Vea también