SQL Service Broker и .NET Windows Service - лучшие практики?
-
19-08-2019 - |
Вопрос
В настоящее время у меня есть база данных, которая обновляется из устаревшего приложения. Я хотел бы использовать очередь SQL Service Broker, чтобы при обновлении записи в очередь помещалось сообщение (с использованием триггера или чего-то еще).
Затем я хотел бы иметь долго работающее приложение (служба Windows, написанное на .NET), которое постоянно " listen " в очередь, чтобы получить сообщения и обработать их для другого приложения.
Я нашел пример кода в Интернете и просто хотел получить некоторую информацию о том, является ли код надежным или нет. Итак, вот сокращенная версия класса обслуживания 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-секундный сон для задержки, но 2-секундный тайм-аут на WAITFOR позволил бы сделать то же самое.
У службы есть 30 секунд для остановки, или Windows посчитает, что она зависла. Р>