2016-06-06 70 views
0

我有一個服務器代理應用程序,我繼承了一個假陰性。SQL Server sys.dm_broker_activated_tasks告訴我什麼?

我認爲它錯誤地使用了sys.dm_broker_activated_tasks,我想驗證我對該視圖顯示的理解是否正確。

我可以假設這個視圖顯示正在激活的任務,沒有那麼多被激活,但現在正在完成的任務?

我通過查找sys.dm_broker_activated_tasks中沒有條目的那個隊列來監視完成處理的過程。

此隊列中的處理被卷繞下來的時候出現的工作(大多),除了偶爾在末端。

該表中的行似乎在隊列中的最終消息完成之前消失。

不幸的是,由於這種方式使用了火併且遺忘了反模式,所以我現在不能真正做到讓投票顯示器變得更智能一點。

+0

你能描述你的過程多一點,你有什麼問題?看起來你正在試圖找出隊列中是否還有消息,說明你的激活過程沒有處理。但我可能會錯過一些東西...... –

+0

我真的不想看看隊列中是否有消息。最終的消息已經收到,並且激活的過程抓住它沒有完成運行。發送消息的監控程序需要知道最終激活的進程在退出並出現錯誤狀態之前的狀態。 – Rawheiser

+0

我希望在處理最後的消息和激活的過程完成之間存在一點點滯後,這是基於什麼「最佳實踐」將「receive」放入帶有超時的「waitfor」中。我仍然試圖弄清楚你想要做什麼 - 如果你試圖查看是否所有的消息都被處理了,請從dbo.youQueue中選擇一個「select count(*)」。另外,您可能希望將邏輯放入激活的過程中,以基於該消息的處理狀態更新狀態表。 –

回答

0

這一觀點不會做太多分開:

返回由服務代理激活的每個存儲過程的行。

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。您會看到發送的每封郵件,直到收到確認信息。

相關問題