Solucionar problemas de enrutamiento y entrega de mensajes

En esta sección se proporcionan sugerencias para corregir problemas habituales relacionados con el enrutamiento y la entrega de mensajes.

Técnica: diagnosticar la entrega de mensajes

Si los mensajes no se entregan correctamente entre dos servicios, use la utilidad ssbdiagnose para generar un informe en tiempo de ejecución de una conversación. El informe en tiempo de ejecución mostrará cualquier error detectado por las operaciones de la conversación. Si se encuentran errores, ssbdiagnose también analizará la configuración entre los servicios y notificará cualquier problema de configuración que detecte. Para obtener más información, vea Utilidad ssbdiagnose.

Problema: los mensajes permanecen en la cola de transmisión

Asegúrese de que la entrega de mensajes de Service Broker está activada en la base de datos. La columna is_broker_enabled de sys.databases muestra si la entrega de mensajes de Service Broker está activada, como se muestra en el ejemplo siguiente:

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

La entrega de mensajes de Service Broker se puede desactivar para evitar que los mensajes se entreguen a la base de datos incorrecta. Para obtener más información acerca de la entrega de mensajes de Service Broker, vea Administrar identidades de Service Broker. Para obtener más información sobre cómo activar la entrega de mensajes de Service Broker, vea Cómo activar la entrega de mensajes de Service Broker en las bases de datos (Transact-SQL).

Si la entrega de mensajes de Service Broker está activa, compruebe los mensajes en la columna transmission_status de la vista de catálogo sys.transmission_queue. A continuación se describen los mensajes de error más comunes:

Mensaje

Descripción

Ninguna ruta coincide con el nombre del servicio.

Service Broker no ha podido localizar ninguna ruta al servicio especificado.

El Service Broker de destino está inaccesible.

Service Broker no ha podido entregar el mensaje al Service Broker de destino.

El nivel de transporte no está disponible.

No existe ningún extremo de Service Broker en la instancia o el extremo de Service Broker no se inició correctamente.

La cola de destino está deshabilitada.

La cola que utiliza el servicio de destino tiene la opción STATUS establecida en OFF. Service Broker no agrega mensajes nuevos a una cola con un STATUS de OFF.

Error al recibir datos: '10054 (el host remoto forzó el cierre de la conexión existente)'.

El lado remoto de la conversación ha aceptado la conexión TCP/IP, pero la ha cerrado antes de que se pudiera enviar un mensaje.

(Ninguno)

Service Broker todavía no ha intentado enviar el mensaje. Si la columna enqueue_time muestra que el mensaje ha estado mucho tiempo en la cola, es posible que la entrega de mensajes de Service Broker no se haya activado en la base de datos.

Problema: existe una ruta, pero el estado de transmisión muestra que no hay ninguna ruta para el servicio

Las causas más comunes para este problema son las siguientes:

  • La instrucción SEND creó el mensaje cuando no existía ninguna ruta para entregar correctamente el mensaje.

  • Después se creó la ruta, pero Service Broker todavía no ha intentado enviar de nuevo el mensaje.

Para obtener más información acerca de los reintentos, vea Enrutamiento y redes de Service Broker.

Asegúrese de que el nombre del servicio especificado en el mensaje coincide exactamente con el nombre del servicio especificado en la ruta. Service Broker usa una comparación binaria byte a byte para los nombres de servicio. Si existe una ruta que especifica el nombre del servicio, puede comparar los nombres ejecutando la consulta siguiente:

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) ;

[!NOTA]

Algunos nombres de servicio podrían aparecer en el conjunto de resultados aunque coincidan con una ruta. Una ruta que no especifica un nombre de servicio (remote_service_name = NULL) coincidirá con el nombre de servicio utilizado por cualquier mensaje.

Para obtener más información acerca de las rutas de Service Broker, vea Enrutamiento de Service Broker.

Si el mensaje especifica un identificador de instancia de Service Broker, compruebe si la ruta especifica el mismo identificador o no especifica ninguno.

Compruebe que la ruta no ha caducado. La columna de vigencia de la vista de catálogo sys.routes contiene la hora y fecha de caducidad de la ruta.

Problema: el estado de transmisión muestra que no se puede obtener acceso al Service Broker de destino

El destino no ha aceptado el mensaje. Esto puede indicar que el nombre del servicio especificado no coincide con el nombre de ningún servicio hospedado en la instancia de destino de SQL Server. También podría indicar que el destino no contiene una ruta para el servicio. Para solucionar este problema, compruebe la configuración del servicio y el enrutamiento para el destino.

Problema: el estado de transmisión muestra que el nivel de transporte no está disponible

Compruebe que existe un extremo de Service Broker. Si no existe ningún extremo, cree uno. Si existe un extremo, compruebe que su estado es STARTED. Para obtener más información, vea Extremos de Service Broker. Para obtener más información sobre cómo se crea un extremo, vea Cómo activar las funciones de red de Service Broker (Transact-SQL).

Problema: el estado de transmisión muestra que el host remoto forzó el cierre de la conexión existente

Es posible que la seguridad de transporte esté mal configurada o que la dirección TCP/IP de la ruta especifique un puerto que está utilizando un servicio distinto de Service Broker.

[!NOTA]

La ruta debe especificar un puerto que coincida con el que utiliza el extremo de Service Broker en la instancia remota de Database Engine (Motor de base de datos). Service Broker usa los protocolos de comunicaciones de Service Broker para transmitir mensajes, no el protocolo de secuencia de datos tabular (TDS) que se emplea para transmitir los lotes y los resultados de Transact-SQL. Por consiguiente, el puerto utilizado por un extremo de Service Broker difiere del puerto que se utiliza para transmitir Transact-SQL.

Compruebe la configuración del extremo de Service Broker para asegurarse de que las dos instancias tienen parámetros de seguridad de red compatibles. Si el extremo de Service Broker para una instancia especifica REQUIRED o ENABLED, el extremo de Service Broker para la otra instancia no puede especificar NONE.

Compruebe los certificados, los usuarios y los permisos de la seguridad de transporte de Service Broker. Para obtener más información, vea Seguridad de transporte de Service Broker.