Solucionando problemas de roteamento e entrega de mensagens

Esta seção fornece sugestões para corrigir problemas comuns relacionados ao roteamento e à entrega de mensagens.

Técnica: Diagnosticando a entrega de mensagens

Se as mensagens não forem entregues com êxito entre os dois serviços, use o utilitário ssbdiagnose para gerar um relatório de tempo de execução de uma conversação. O relatório de tempo de execução exibirá os erros encontrados pelas operações de conversação. Se forem encontrados erros, ssbdiagnose também analisará a configuração entre os serviços e reportará qualquer problema de configuração encontrado. Para obter mais informações, consulte Utilitário ssbdiagnose.

Problema: As mensagens permanecem na fila de transmissão

Assegure que a entrega de mensagens do Service Broker esteja ativada no banco de dados. A coluna is_broker_enabled de sys.databases mostra se a entrega de mensagens do agente está ativada, conforme mostrado no exemplo a seguir:

SELECT is_broker_enabled FROM sys.databases
WHERE database_id = DB_ID() ;

A entrega de mensagens do agente pode ser desativada para impedir que as mensagens sejam entregues ao banco de dados errado. Para obter mais informações sobre a entrega de mensagens do Service Broker, consulte Gerenciando identidades do Service Broker. Para obter mais informações sobre como ativar a entrega de mensagens do Service Broker, consulte Como ativar a entrega de mensagens do Service Broker em bancos de dados (Transact-SQL).

Se a entrega de mensagens do Service Broker estiver ativa, verifique a coluna transmission_status na exibição de catálogo sys.transmission_queue das mensagens. Mensagens de erro comuns incluem as seguintes:

Mensagem

Descrição

Nenhuma rota para serviço.

O Service Broker não pôde localizar uma rota para o serviço especificado.

O Service Broker de destino está inacessível.

O Service Broker não pôde entregar a mensagem para o Service Broker de destino.

A camada de transporte está indisponível.

Nenhum ponto de extremidade do Service Broker existe na instância ou o ponto de extremidade do Service Broker não foi iniciado com êxito.

A fila de destino está desabilitada.

A fila que o serviço de destino usa tem a opção STATUS definida como OFF. O Service Broker não adiciona nenhuma mensagem à fila com STATUS de OFF.

Erro ao receber dados: '10054 (uma conexão existente foi fechada de modo forçado pelo host remoto)'.

O lado remoto da conversação aceitou a conexão TCP/IP, mas fechou a conexão antes do envio de uma mensagem.

(Nenhuma)

O Service Broker ainda não tentou enviar a mensagem. Se a coluna enqueue_time mostrar que a mensagem está na fila há muito tempo, talvez a entrega de mensagens do Service Broker não tenha sido ativada no banco de dados.

Problema: A rota existe, o status de transmissão mostra que não há rota para o serviço

As causas mais comuns para esse problema são as seguintes:

  • A instrução SEND criou a mensagem quando não havia nenhuma rota para entrega bem-sucedida da mensagem.

  • A rota foi criada então, mas o Service Broker ainda não tentou reenviar a mensagem.

Para obter mais informações sobre as entradas, consulte Sistema de rede e roteamento do Service Broker.

Verifique se o nome do serviço especificado na mensagem corresponde exatamente ao nome do serviço especificado na rota. O Service Broker usa uma comparação binária byte-por-byte para associar nomes de serviço. Se uma rota que especifica o nome de serviço existir, você poderá comparar os nomes executando a seguinte consulta:

SELECT N'No Exact Match' = tq.to_service_name
FROM sys.transmission_queue AS tq
WHERE NOT EXISTS
    (SELECT remote_service_name
     FROM sys.routes AS routes
     WHERE tq.to_service_name = routes.remote_service_name) ;
ObservaçãoObservação

Alguns nomes de serviço podem se aparecer no conjunto de resultados, embora eles correspondam a uma rota. Uma rota que não especifica um nome de serviço (remote_service_name = NULL) corresponderá ao nome do serviço usado com qualquer mensagem.

Para obter mais informações sobre as rotas do Service Broker, consulte Roteamento do Service Broker.

Se a mensagem especifica um identificador de instância de agente, verifique se a rota especifica o mesmo identificador de instância de agente, ou simplesmente não identifica um identificador desse tipo.

Verifique se a rota não expirou. A coluna de tempo de vida da exibição de catálogo de sys.routes contém a data e a hora de expiração da rota.

Problema: O status da transmissão mostra o agente de serviço de destino inacessível

O destino não aceitou a mensagem. Isso pode indicar que o nome do serviço especificado não corresponde ao nome de um serviço hospedado pela instância do SQL Server. Também pode indicar que o destino não contém uma rota para o serviço. Diagnostique esse problema, verifique a configuração de roteamento e de serviço para o destino.

Problema:O status de transmissão mostra a camada de transporte indisponível

Verifique se um ponto de extremidade do Service Broker existe. Se não houver nenhum ponto de extremidade, crie um. Se houver um ponto de extremidade, verifique se o estado dele é STARTED. Para obter mais informações, consulte Pontos de extremidade do Service Broker. Para obter mais informações sobre como criar um ponto de extremidade, consulte Como ativar o sistema de rede do Service Broker (Transact-SQL).

Problema: O status da transmissão mostra "uma conexão existente foi fechada de modo forçado pelo host remoto"

Talvez a segurança do transporte esteja configurada incorretamente ou o endereço TCP/IP da rota especifica uma porta que está sendo usada por outro serviço, sem ser o Service Broker.

ObservaçãoObservação

A porta especificada na rota deve corresponder à porta usada pelo ponto de extremidade do Service Broker na instância remota do Mecanismo de Banco de Dados. O Service Broker usa os protocolos de comunicação do Service Broker para transmitir mensagens, não o protocolo TDS usado para transmitir lotes e resultados Transact-SQL. Assim, a porta usada por um ponto de extremidade do Service Broker é diferente da porta usada para transmitir Transact-SQL.

Verifique a configuração de ponto de extremidade do Service Broker para assegurar que as duas instâncias tenham configurações de segurança de rede compatíveis. Se o ponto de extremidade doService Broker de uma instância especificar REQUIRED ou ENABLED, o ponto de extremidade do Service Broker da outra instância não poderá especificar NONE.

Verifique os certificados, os usuários e as permissões da segurança de transporte do Service Broker. Para obter mais informações, consulte Segurança de transporte do Service Broker.