Lição 3: Iniciar uma conversa e transmitir mensagens

Aplica-se a:SQL ServerAzure 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.