路由和消息传递故障排除
本部分提供解决与路由和消息传递相关的常见故障的建议。
故障:消息停留在传输队列中
确保在数据库中激活了 Service Broker 消息传递。sys.databases 的 is_broker_enabled 列显示 Broker 消息传递是否已激活,如下例所示:
SELECT is_broker_enabled FROM sys.databases
WHERE database_id = DB_ID() ;
Broker 消息传递可以停用,以防止将消息误传到其他数据库中。有关 Service Broker 消息传递的详细信息,请参阅管理 Service Broker 标识。有关激活 Service Broker 消息传递的详细信息,请参阅如何在数据库中激活 Service Broker 消息传递 (Transact-SQL)。
如果 Service Broker 消息传递处于活动状态,请在 sys.transmission_queue 目录视图中检查消息的 transmission_status 列。常见的错误消息包括:
消息 | 说明 |
---|---|
无服务路由。 |
Service Broker 找不到通向指定服务的路由。 |
无法访问目标 Service Broker。 |
Service Broker 无法将消息传递给目标 Service Broker。 |
传输层不可用。 |
实例中不存在 Service Broker 端点,或者 Service Broker 端点没有成功启动。 |
目标队列已禁用。 |
目标服务所使用的队列的 STATUS 选项设置为 OFF。Service Broker 不会将新消息添加到 STATUS 为 OFF 的队列中。 |
接收数据时出错: '10054 (现有连接已被远程主机强行关闭。)'。 |
虽然会话的远程端接受了 TCP/IP 连接,但在允许发送消息前关闭了此连接。 |
(无) |
Service Broker 未尝试过发送消息。这可能指示未在数据库中激活 Service Broker 消息传递。 |
故障:路由存在,传输状态显示无服务路由
如果路由是在消息之后创建的,则此故障的最常见原因是在创建路由之后未重试过该消息。有关重试的详细信息,请参阅 Service Broker 路由和网络。
请检查以确保消息中指定的服务名称完全匹配路由中指定的服务名称。Service Broker 采用逐字节的二进制比较方式来匹配服务名称。如果指定服务名称的路由存在,则检查此比较的一种方式是运行一个类似于如下所示的查询:
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) ;
数据库的路由表中没有与结果集中所出现的服务名称完全匹配的项。请注意,不指定服务名称的路由将匹配任何服务名称。有关路由的详细信息,请参阅 Service Broker 路由。
如果消息指定 Broker 实例标识符,请检查路由指定的是相同的 Broker 实例标识符还是没有指定 Broker 实例标识符。
请检查路由是否尚未过期。sys.routes 目录视图的生存期列包含路由的过期日期和时间。
故障:传输状态显示无法访问目标 Service Broker
目标不接受消息。这可能指示指定的服务名称不匹配以目标 SQL Server 实例为宿主的服务名称,或者目标不包含服务的路由。若要解决此问题,请检查目标的路由和服务配置。
故障:传输状态显示传输层不可用
检查 Service Broker 端点是否存在,并检查端点的状态是否为 STARTED。如果不存在,请创建一个端点。有关 Service Broker 端点的详细信息,请参阅 Service Broker 端点。有关创建端点的详细信息,请参阅如何激活 Service Broker 网络 (Transact-SQL)。
故障:传输状态显示“现有连接已被远程主机强行关闭”
传输安全模式的配置可能不正确,或者路由的 TCP/IP 地址指定了在由 Service Broker 以外的其他服务使用的端口。请注意,Service Broker 不使用表格格式数据流协议。路由所指定的端口必须与远程 SQL Server 实例上的 Service Broker 端点所使用的端口相对应。
检查 Service Broker 端点配置,以确保这两个实例具有兼容的网络安全设置。如果一个实例的 Service Broker 端点指定 REQUIRED 或 ENABLED,则另一个实例的 Service Broker 端点不能指定 NONE。
请检查 Service Broker 传输安全模式的证书、用户和权限。传输安全模式的配置在主题 Service Broker 传输安全模式中加以说明。
请参阅
任务
如何激活 Service Broker 网络 (Transact-SQL)
概念
Service Broker 路由和网络
Service Broker 端点
Service Broker 路由
启动和停止队列
其他资源
sys.databases (Transact-SQL)
sys.transmission_queue (Transact-SQL)
sys.routes (Transact-SQL)
sys.service_broker_endpoints (Transact-SQL)