我有一个我继承的服务器代理应用程序,它带有假阴性。
我认为它错误地使用sys.dm_broker_activated_tasks
,我想验证我对该视图显示的内容的理解是正确的。
我可以假设此视图显示正在激活的任务,并且没有那么多被激活但现在正在完成的过程吗?
我通过查找该队列的sys.dm_broker_activated_tasks
中没有条目来监视完成处理的过程。
当队列中的处理结束时,这似乎有效( ),除之外偶尔。
该表中的行似乎在队列中的最后一条消息完成之前消失。
不幸的是,由于这会使用火并忘记反模式,所以我现在不能做的不仅仅是使轮询监视器更聪明一些。
答案 0 :(得分:0)
除了:
之外,这种观点并没有太大作用为Service Broker激活的每个存储过程返回一行。
https://msdn.microsoft.com/en-us/library/ms175029.aspx
不确定您是否查看了代码,但我认为更好地使用它是将其与 sys.dm_exec_sessions
结合使用select
at.spid
,DB_NAME(at.database_id) AS [DatabaseName]
,at.queue_id
,at.[procedure_name]
,s.[status]
,s.login_time
from
sys.dm_broker_activated_tasks at
inner join
sys.dm_exec_sessions s
on
at.spid = s.session_id;
对Service Broker进行故障排除的另一个好处是sys.transmission_queue。您将看到发送的每条消息,直到收到确认消息为止。