Dot-Net
SQL Service Broker 和 .NET Windows 服務 - 最佳實踐?
我目前有一個從舊應用程序更新的數據庫。我想利用 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 會認為它卡住了。