Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Se aplica a:SQL Server
Azure SQL Managed Instance
En esta lección, aprenderá a completar un ciclo básico de mensajes de solicitud-respuesta en un sistema configurado con un procedimiento almacenado de activación interno.
Procedimientos
Cambiar a la base de datos AdventureWorks
Nota:
Los ejemplos de código de este artículo se probaron mediante la base de datos de ejemplo AdventureWorks2025, que puede descargar de la página principal de ejemplos y proyectos de comunidad de Microsoft SQL Server .
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 AdventureWorks2025 base de datos.
USE AdventureWorks2022;
GO
Inicio de una conversación y enviar un mensaje de solicitud
Copie y pegue el código siguiente en una ventana del Editor de consultas y, a continuación, ejecútelo para iniciar una conversación y enviar un mensaje de solicitud al AWDB/InternalAct/TargetService. El código debe ejecutarse en un bloque, ya que 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. Crea un mensaje de solicitud y, 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 [//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);
-- Display 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 RECEIVE declaración recupera el mensaje de respuesta del IniciadorQueueIntAct. La END CONVERSATION instrucción finaliza el lado iniciador de la conversación y envía un mensaje EndDialog al servicio de destino. 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 InitiatorQueueIntAct),
TIMEOUT 5000;
END CONVERSATION @RecvReplyDlgHandle;
-- Display received request.
SELECT @RecvReplyMsg AS ReceivedReplyMsg;
COMMIT TRANSACTION;
GO
Finalizar la conversación en el lado de destino
Cuando ejecutas la END CONVERSATION instrucción para el iniciador, Service Broker envía un mensaje EndDialog a la cola TargetQueueIntAct. El procedimiento TargetActiveProc recibe el mensaje EndDialog y emite un END CONVERSATION que finaliza el lado de destino de la conversación.
Paso siguiente
Ha completado correctamente un ciclo de mensajes de solicitud-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 termine de examinar las instrucciones SEND y REPLY, puede eliminar todos los objetos que fueron utilizados por la conversación.