sys.dm_broker_queue_monitors (Transact-SQL)

适用于SQL Server

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

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

无效

通知

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

注意:此数字包括执行 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)