sys.dm_broker_queue_monitors (Transact-SQL)

适用于:SQL Server

对于实例中的每个队列监视器,相应地返回一行。 队列监视器负责管理队列的激活。

列名称 数据类型 说明
database_id int 数据库的对象标识符,该数据库包含了监视器所观察的队列。 空。
queue_id int 监视器所观察的队列的对象标识符。 空。
State nvarchar(32) 监视器的状态。 空。 这是以下项之一:

无效

NOTIFIED

RECEIVES_OCCURRING
last_empty_rowset_time datetime 来自队列的 RECEIVE 上次返回空结果时的时间。 空。
last_activated_time datetime 此队列监视器上次激活存储过程时的时间。 空。
tasks_waiting int 当前正在 RECEIVE 语句中等待此队列的会话数。 空。

注意:此数字包括执行接收语句的任何会话,无论队列监视器是否启动会话。 它表示您是否与 RECEIVE 一起使用 WAITFOR。 基本上,这些任务都在等待到达队列的消息。

权限

要求具有服务器的 VIEW SERVER STATE 权限。

SQL Server 2022 及更高版本的权限

需要对服务器具有 VIEW SERVER PERFORMANCE STATE 权限。

示例

A. 当前状态队列监视器

此方案提供了所有消息队列的当前状态。

SELECT t1.name AS [Service_Name],  t3.name AS [Schema_Name],  t2.name AS [Queue_Name],    
CASE WHEN t4.state IS NULL THEN 'Not available'   
ELSE t4.state   
END AS [Queue_State],    
CASE WHEN t4.tasks_waiting IS NULL THEN '--'   
ELSE CONVERT(VARCHAR, t4.tasks_waiting)   
END AS tasks_waiting,   
CASE WHEN t4.last_activated_time IS NULL THEN '--'   
ELSE CONVERT(varchar, t4.last_activated_time)   
END AS last_activated_time ,    
CASE WHEN t4.last_empty_rowset_time IS NULL THEN '--'   
ELSE CONVERT(varchar,t4.last_empty_rowset_time)   
END AS last_empty_rowset_time,   
(   
SELECT COUNT(*)   
FROM sys.transmission_queue t6   
WHERE (t6.from_service_name = t1.name) ) AS [Tran_Message_Count]   
FROM sys.services t1    INNER JOIN sys.service_queues t2   
ON ( t1.service_queue_id = t2.object_id )     
INNER JOIN sys.schemas t3 ON ( t2.schema_id = t3.schema_id )    
LEFT OUTER JOIN sys.dm_broker_queue_monitors t4   
ON ( t2.object_id = t4.queue_id  AND t4.database_id = DB_ID() )    
INNER JOIN sys.databases t5 ON ( t5.database_id = DB_ID() );  

另请参阅

动态管理视图和函数 (Transact-SQL)
与 Service Broker 有关的动态管理视图 (Transact-SQL)