Sql-Server

從隊列中連續接收的正確方法

  • September 3, 2021

我必須不斷地從隊列中接收消息。

我目前的程式碼如下所示:

   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 的文章,絕對值得一看。上面的程式碼也改編自他的網站。

外部啟動更複雜並且有更多移動部分,但它允許您啟動外部程序。這很棒,因為您可以執行用任何語言編寫的程式碼,還可以從數據庫伺服器本身中消除處理負載。

引用自:https://dba.stackexchange.com/questions/297937