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
A maioria dos aplicativos do Service Broker segue as mesmas etapas básicas para receber e processar mensagens:
O aplicativo inicia uma transação.
Se o aplicativo mantiver o estado, o aplicativo obterá um identificador de grupo de conversação. O aplicativo usa esse identificador para restaurar o estado de uma tabela de estados. Se não houver nenhum grupo de conversação com mensagens prontas para serem recebidas, o aplicativo reverte a transação e sai.
O aplicativo recebe uma ou mais mensagens da fila. Se o aplicativo tiver um identificador de grupo de conversação, o aplicativo usará o identificador de grupo de conversação para receber mensagens para esse grupo de conversação. Se não houver mais mensagens disponíveis para serem recebidas, o aplicativo confirmará a transação e retornará à Etapa 1.
O aplicativo valida o conteúdo das mensagens com base no nome do tipo de mensagem.
O aplicativo processa as mensagens com base no nome do tipo de mensagem e no conteúdo da mensagem.
O aplicativo envia todas as mensagens que resultam do processamento.
Se o aplicativo mantiver o estado, o aplicativo atualizará a tabela de estados, usando o identificador do grupo de conversação como a chave primária para a tabela.
O aplicativo retorna à Etapa 3 para verificar se mais mensagens estão disponíveis.
A estrutura precisa do aplicativo depende dos requisitos do aplicativo, do estilo de comunicação do aplicativo, se o aplicativo é um serviço de destino ou um serviço iniciador e se o Service Broker ativa o aplicativo ou não.
Por exemplo, um aplicativo inicial envia uma mensagem antes de iniciar o loop de processamento descrito nas etapas anteriores. O serviço inicial pode enviar uma mensagem de outro programa ou procedimento armazenado e, em seguida, usar um procedimento armazenado de ativação para a fila de serviço inicial. Por exemplo, um aplicativo de entrada de ordem pode incluir um aplicativo externo que inicia a conversa para inserir a ordem. Depois que o pedido é inserido, o aplicativo externo não precisa permanecer em execução. Um procedimento armazenado de ativação do serviço inicial envia a confirmação do pedido quando é recebida uma resposta do serviço de pedidos. O procedimento armazenado de ativação também processa quaisquer mensagens de erro do Service Broker retornadas pelo serviço de destino e envia notificações de que o pedido não pôde ser confirmado.
Como alternativa, em vez de enviar uma mensagem de um programa diferente, o aplicativo inicial pode enviar uma mensagem e, em seguida, iniciar o loop de processamento como parte do mesmo programa. Independentemente dessas variações, o esboço básico permanece o mesmo.
Um aplicativo que processa um grande número de mensagens no mesmo grupo de conversação pode manter uma contagem de mensagens recebidas e confirmar uma transação após o processamento de um determinado número de mensagens. Essa estratégia de contagem e confirmação permite que o aplicativo mantenha as transações relativamente curtas e permite que o aplicativo processe diferentes grupos de conversa.
Examples
O exemplo de Transact-SQL a seguir processa todas as mensagens na fila MyServiceQueue. O processamento da mensagem é mínimo. Se a mensagem for uma EndDialog ou uma mensagem de erro, o código encerra a conversa. Para qualquer outra mensagem, o código cria uma representação XML da mensagem e produz um conjunto de resultados que contém o identificador de conversa, o nome do tipo de mensagem e o XML. Quando nenhuma mensagem está disponível por 500 milissegundos, o código é encerrado.
Para simplificar, o script produz um conjunto de resultados para cada mensagem. Se ocorrer um erro durante a leitura da fila, o script confirmará as alterações sem produzir qualquer resultado. Portanto, esse script removerá silenciosamente todas as mensagens que causam um erro.
Observação
Como o script simplesmente exibe mensagens, nenhuma mensagem suspeita é possível para esse script. Portanto, o script não contém código para lidar com mensagens suspeitas. Um aplicativo de produção deve ser escrito para lidar com mensagens venenosas. Para obter mais informações sobre mensagens suspeitas, consulte Manipular mensagens suspeitas.
Observação
Os exemplos de código neste artigo foram testados usando o banco de dados de exemplo AdventureWorks2025, que você pode baixar da página principal do Microsoft SQL Server Samples and Community Projects .
USE [AdventureWorks2022];
GO
-- Process all conversation groups.
WHILE (1 = 1)
BEGIN
DECLARE @conversation_handle AS UNIQUEIDENTIFIER,
@conversation_group_id AS UNIQUEIDENTIFIER,
@message_body AS XML,
@message_type_name AS NVARCHAR (128);
-- Begin a transaction, one per conversation group.
BEGIN TRANSACTION;
-- Get next conversation group.
WAITFOR (GET CONVERSATION GROUP
@conversation_group_id FROM [MyServiceQueue]),
TIMEOUT 500;
-- Restore the state for this conversation group here
-- If there are no more conversation groups, break.
IF @conversation_group_id IS NULL
BEGIN
ROLLBACK;
BREAK;
END
-- Process all messages in the conversation group.
WHILE 1 = 1
BEGIN
-- Get the next message.
RECEIVE TOP (1)
@conversation_handle = [conversation_handle],
@message_type_name = [message_type_name],
@message_body = CASE
WHEN [validation] = 'X' THEN CAST ([message_body] AS XML)
ELSE CAST (N'<none/>' AS XML)
END
FROM [MyServiceQueue]
WHERE CONVERSATION_GROUP_ID = @conversation_group_id;
-- If there is no message, or there is an error
-- reading from the queue, break.
IF @@ROWCOUNT = 0
OR @@ERROR <> 0
BREAK;
-- Process the message. In this case, the program ends the conversation
-- for Error and EndDialog messages. For all other messages, the program
-- produces a result set with information about the message.
SELECT @conversation_handle,
@message_type_name,
@message_body;
-- If the message is an end dialog message or an error,
-- end the conversation. Notice that other conversations
-- in the same conversation group may still have messages
-- to process. Therefore, the program does not break after
-- ending the conversation.
IF @message_type_name = 'https://schemas.microsoft.com/SQL/ServiceBroker/EndDialog'
OR @message_type_name = 'https://schemas.microsoft.com/SQL/ServiceBroker/Error'
BEGIN
END CONVERSATION @conversation_handle;
END
END -- Process all messages in conversation group.
COMMIT TRANSACTION;
END -- Process all conversation groups.