Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Azure SQL Managed Instance
Nesta lição, você aprende a concluir um ciclo básico de mensagens de solicitação-resposta em um sistema configurado com um procedimento armazenado de ativação interno.
Procedimentos
Alternar para o banco de dados AdventureWorks
Observação
Os exemplos de código neste artigo foram testados usando o banco de dados de exemplo AdventureWorks2025, que podes baixar da página inicial Microsoft SQL Server Samples and Community Projects.
Copie e cole o código a seguir em uma janela do Editor de Consultas e execute-o para alternar o contexto para o AdventureWorks2025 banco de dados.
USE AdventureWorks2022;
GO
Iniciar uma conversa e enviar uma mensagem de solicitação
Copie e cole o código a seguir em uma janela do Editor de Consultas, execute-o para iniciar uma conversa e enviar uma mensagem de solicitação para o AWDB/InternalAct/TargetService. O código deve ser executado em um bloco, porque uma variável é usada para passar um identificador de diálogo de BEGIN DIALOG para a SEND instrução. O lote executa a instrução BEGIN DIALOG para iniciar a conversação. Ele cria uma mensagem de solicitação e, em seguida, usa o identificador de diálogo em uma SEND instrução para enviar a mensagem de solicitação nessa conversa. A última instrução SELECT exibe o texto da mensagem que foi enviada.
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
Receba o pedido e envie uma resposta
Quando você envia a mensagem de solicitação, o Service Broker ativa automaticamente uma cópia do TargetActiveProc. O procedimento armazenado recebe a mensagem de resposta do TargetQueueIntAct e envia uma mensagem de resposta de volta ao iniciador.
Receba a resposta e termine a conversa
Copie e cole o código a seguir em uma janela do Editor de Consultas. Em seguida, execute-o para receber a mensagem de resposta e encerrar a conversa. A RECEIVE instrução recupera a mensagem de resposta do InitiatorQueueIntAct. A END CONVERSATION instrução encerra o lado de origem da conversa e envia uma mensagem EndDialog para o serviço de destino. A última instrução SELECT exibe o texto da mensagem de resposta para que se possa confirmar se é a mesma que foi enviada na etapa 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
Terminar o lado alvo da conversa
Quando executa a instrução END CONVERSATION para o iniciador, o Service Broker envia uma mensagem EndDialog para a fila TargetQueueIntAct. O procedimento TargetActiveProc recebe a mensagem EndDialog e emite um END CONVERSATION que termina o lado de destino da conversa.
Próximo passo
Você concluiu com êxito um ciclo de mensagens de solicitação-resposta entre o AWDB/InternalAct/InitiatorService e o AWDB/InternalAct/TargetService. Você pode repetir as etapas desta lição quantas vezes quiser transmitir um par de mensagens solicitação-resposta. Quando terminares de investigar as instruções SEND e REPLY, poderás eliminar todos os objetos que foram usados pela conversa.