2009-01-20 34 views
12

Tôi hiện có cơ sở dữ liệu được cập nhật từ ứng dụng cũ. Tôi muốn sử dụng hàng đợi của Nhà môi giới dịch vụ SQL để khi một bản ghi được cập nhật, một thông điệp được đặt trong hàng đợi (sử dụng một kích hoạt hoặc một cái gì đó).Nhà môi giới dịch vụ SQL và Dịch vụ Windows .NET - Các phương pháp hay nhất?

Sau đó tôi muốn có một ứng dụng chạy dài (dịch vụ Windows được viết bằng .NET) liên tục "nghe" hàng đợi để lấy các thông điệp và xử lý chúng cho một ứng dụng khác.

Tôi đã tìm thấy một số mã mẫu trên web và chỉ muốn nhận được một số thông tin đầu vào về việc mã có vững chắc hay không. Vì vậy, đây là phiên bản rút gọn của lớp dịch vụ 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 
        } 
       } 
      } 
     } 
    } 
} 

Bạn nghĩ sao? Mã hoạt động chính xác theo cách tôi muốn. Nhưng ý tưởng xoay vòng một luồng mới có chứa một lệnh SQL sẽ không bao giờ hết thời gian - bên trong một vòng lặp vô hạn - làm cho tôi hơi lo lắng.

Trả lời

7

Dịch vụ của bạn sẽ không tắt máy nếu bạn đang ở trong vòng lặp vô hạn. Bạn nên kiểm tra điều kiện thoát, được cài đặt khi dịch vụ nhận được thông báo tắt máy. Bạn có thể thêm một thời gian chờ để WAITFOR để bạn có thể kiểm tra xem bạn nên tắt. Bạn cũng nên kiểm tra điều này trên mỗi hàng được xử lý.

Tôi đã sử dụng một giấc ngủ thứ hai cho sự chậm trễ, nhưng làm một thời gian chờ 2 giây trên WAITFOR sẽ thực hiện điều tương tự.

Dịch vụ có 30 giây để tắt hoặc Windows sẽ xem xét nó bị kẹt.

Các vấn đề liên quan