2009-01-20 75 views
12

我目前有一個數據庫從遺留應用程序獲取更新。我想利用SQL Service Broker隊列,以便在更新記錄時將消息放入隊列中(使用觸發器或其他)。SQL Service Broker和.NET Windows服務 - 最佳實踐?

然後我想要一個長時間運行的應用程序(用.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命令的新線程的想法永遠不會超時 - 在一個無限循環內 - 讓我有點緊張。

回答

7

如果您處於無限循環狀態,您的服務將無法完全關閉。您應該檢查退出條件,在服務獲取關閉消息時設置。您可以向WAITFOR添加超時,以便檢查是否應該關閉。你也應該檢查每一行處理。

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

服務有30秒關閉或Windows會認爲它卡住了。