Dot-Net

SQL Service Broker 和 .NET Windows 服務 - 最佳實踐?

  • January 20, 2009

我目前有一個從舊應用程序更新的數據庫。我想利用 SQL Service Broker 隊列,以便在更新記錄時將消息放入隊列中(使用觸發器或其他東西)。

然後,我想要一個長時間執行的應用程序(用 .NET 編寫的 Windows 服務),它不斷地“監聽”隊列以獲取消息並為另一個應用程序處理它們。

我在網上找到了一些範常式式碼,只是想獲得一些關於程式碼是否可靠的輸入。因此,這是 Windows 服務類的縮寫版本:

public class MyService
{
   public void StartService()
   {
       Thread listener = new Thread(Listen);
       listener.IsBackground = true;
       listener.Start();
   }

   private void Listen()
   {
       while (true)
       {
           using (SqlConnection connection = new SqlConnection(_connectionString))
           {
               string commandText = "WAITFOR ( RECEIVE * FROM MyQueue);";
               using (SqlCommand command = new SqlCommand(commandText, connection))
               {
                   connection.Open();
                   command.CommandTimeout = 0;
                   SqlDataReader reader = command.ExecuteReader();
                   while (reader.Read())
                   {
                       // Process message
                   }
               }
           }
       }
   }
}

你怎麼看?程式碼完全按照我想要的方式工作。但是分離一個包含 SQL 命令的新線​​程的想法永遠不會超時 - 在無限循環中 - 讓我有點緊張。

如果您處於無限循環中,您的服務將不會完全關閉。您應該檢查退出條件,在服務收到關閉消息時設置。您可以向 WAITFOR 添加超時,以便檢查是否應該關閉。您還應該在處理的每一行上檢查這一點。

我使用了 2 秒的睡眠來延遲,但是在 WAITFOR 上執行 2 秒的超時會完成同樣的事情。

服務有 30 秒的時間關閉,否則 Windows 會認為它卡住了。

引用自:https://stackoverflow.com/questions/462426