Sql-Server
從隊列中連續接收的正確方法
我必須不斷地從隊列中接收消息。
我目前的程式碼如下所示:
DECLARE @status INT=1 WHILE @status IS NOT NULL BEGIN WAITFOR (RECEIVE @status=status, @message = message_body FROM dbo.MyQueue) ...
當然,這段程式碼永遠不會結束,我必須手動停止它,但它可以滿足需要。
我正在考慮將此程式碼放在由作業呼叫的 SP 中,一次安排,以便在出現錯誤時恢復呼叫。
我想問的是:
- 工作是啟動“無限”聽眾的正確方式嗎?
- 如果一個作業被安排,比方說,每十秒,它會創建“重疊”的程序嗎?
- 如果我終止工作,呼叫的 SP 是否也會終止?
- 如果沒有,我怎樣才能殺死正在執行的 SP?
雖然 Trubs 的回答確實回答了您的問題並且它可能對您很有用,但我想說從隊列中連續接收的“正確”方法是使用內部或外部的 Service Broker 啟動。
使用內部啟動時,您將儲存過程附加到隊列並告訴 Service Broker 在有消息要處理時啟動它。SP 可以在沒有剩餘工作時終止,並將根據需要重新啟動。此外,如果需要,您可以選擇告訴系統執行您的 SP 的多次啟動。您可以像這樣配置這種類型的啟動:
ALTER QUEUE dbo.MyQueue WITH ACTIVATION ( PROCEDURE_NAME = dbo.MyQueueReaderSP , MAX_QUEUE_READERS = 1 , EXECUTE AS OWNER , STATUS = ON);
可以在Remus Rusanu 的這篇文章中看到使用此功能的範例。他的網站上有很多關於 Service Broker 的文章,絕對值得一看。上面的程式碼也改編自他的網站。
外部啟動更複雜並且有更多移動部分,但它允許您啟動外部程序。這很棒,因為您可以執行用任何語言編寫的程式碼,還可以從數據庫伺服器本身中消除處理負載。