Compartilhar via


Tratando mensagens de erro do Service Broker

Os aplicativos do Service Broker devem tratar de dois tipos de mensagens de erro recebidos das conversações: mensagens de erro criados por um aplicativo que usa o Service Broker e as mensagens de sistema criadas pelo Service Broker.

Condições de erro de aplicativo de relatório

Os aplicativos do Service Broker são normalmente sistemas que consistem em código que executa de forma assíncrona em computadores diferentes. As partes do aplicativo comunicam entre si usando mensagens enviadas em conversações do Service Broker. A parte do aplicativo em um lado de uma conversação do Service Broker pode informar erros de aplicativo ao outro lado enviando mensagens de erro. A parte receptora do aplicativo deve ter código para detectar uma mensagem de erro e tratar corretamente a condição de erro.

Os aplicativos do Service Broker podem comunicar erros usando tipos de mensagem definidos pelo sistema ou pelo aplicativo.

Mensagens de erro definidas pelo sistema

Use a cláusula WITH ERRO da instrução END CONVERSATION para informar erros de aplicativo que são bastante severos para requerer o término da conversação. Por exemplo:

END CONVERSATION @ConversationHandle
    WITH ERROR = 1234 DESCRIPTION = "The account specified in the invoice does not exist, verify the account number."

A instrução END CONVERSATION WITH ERROR:

A parte do aplicativo que recebe a mensagem de Erro deve fazer qualquer limpeza necessária e terminar seu lado da conversação.

Um aplicativo pode terminar uma conversação ativa com um erro a qualquer momento. Porém, se o lado remoto da conversação já tiver terminado a conversação, o Service Broker não enviará a mensagem de erro para o lado remoto. Em vez disso, o Service Broker apenas termina o lado local da conversação e remove todas as mensagens para a conversação da fila local.

Mensagens de erro definidas pelo aplicativo

Você pode usar mensagens de erro definidas pelo aplicativo para informar erros que não são severos o bastante para terminar uma conversação. O designer de aplicativo pode especificar o seguinte:

  • Um ou mais tipos de mensagem que são usados para comunicar esses erros do aplicativo.

  • A lógica para tratar estes tipos de mensagem.

A parte do aplicativo que encontra a condição de erro pode fazer o seguinte:

  • Execute qualquer limpeza exigida para o lado local da conversação.

  • Crie uma mensagem que usa o tipo de mensagem definido pelo aplicativo e o envie na conversação.

A parte remota do aplicativo que recebe a mensagem de erro deve ter código para reconhecer a mensagem de erro e desempenha qualquer limpeza necessária em seu lado da conexão.

Tratamento de mensagens de erro

O código do aplicativo que recebe mensagens de conversações do Service Broker deve ter lógica para processar mensagens de erro recebidas da conversação. O código deve detectar e tratar o seguinte:

  • As mensagens de erro geradas por um aplicativo que usa um tipo de mensagem de erro definido pelo aplicativo.

  • As mensagens de erro geradas por um aplicativo que usa a cláusula WITH ERRO da instrução END CONVERSATION. Essas mensagens de erro usam o tipo de mensagem https://schemas.microsoft.com/SQL/ServiceBroker/Error e têm um número positivo no elemento de código.

  • Mensagens de erro geradas pelo Service Broker. Essas mensagens de erro usam o tipo de mensagem https://schemas.microsoft.com/SQL/ServiceBroker/Error e têm um número negativo no elemento de código. O Service Broker cria uma mensagem de erro quando um erro torna impossível para o Service Broker continuar a conversação. Por exemplo, o Service Broker não pode localizar o serviço de destino, porque o serviço não existe na instância atual e não há entrada para o serviço na tabela de roteamento. Nessa situação, o Service Broker cria uma mensagem de erro para a conversação.

O conjunto de resultados retornado pela instrução RECEIVE contém uma coluna message_type_name. O código que recebe mensagens do Service Broker normalmente usa message_type_name para rotear cada mensagem para o código que processa o tipo de mensagem associado.

A lógica exata que um programa adota para tratar o erro depende do aplicativo. Um exemplo é um programa que usa retenção de mensagem e requer transações de compensação quando a tarefa falha. Quando um erro é recebido, o programa consulta a fila para as mensagens que já foram processadas, realiza as transações de compensação e, em seguida, termina a conversação. Por outro lado, se o programa tiver que registrar somente uma ocorrência de erro, o programa registrará o erro em uma tabela de registro e termina a conversação.

O elemento de código de https://schemas.microsoft.com/SQL/ServiceBroker/Errormessage contém o código de erro. As mensagens de Erro criadas por um aplicativo que usa END CONVERSATION WITH ERROR têm um valor positivo para o código de erro. As mensagens de erro geradas pelo Service Broker contêm valores negativos para o código de erro. O valor do código nas mensagens geradas pelo Service Broker é apenas o valor negativo do erro que gerou a mensagem de error. Por exemplo, quando um erro de validação XML (código de erro 9615) ocorre, o Mecanismo de Banco de Dados cria uma mensagem de error que tem um elemento de código que contém o valor -9615.

Quando um aplicativo recebe uma mensagem de erro, o programa já não pode enviar mensagens naquela conversação. O aplicativo trata o erro e, em seguida, termina seu lado da conversação. Se um aplicativo receber um tipo de mensagem de erro definida pelo aplicativo, a conversação ainda ficará disponível a menos que a parte remota do aplicativo também tenha executado END CONVERSATION.

As rotinas de tratamento de erro devem ser codificadas de modo a impedir mensagens suspeitas. Para obter mais informações, consulte Tratando de mensagens suspeitas.