SQL Service Broker и .NET Windows Service - лучшие практики?

В настоящее время у меня есть база данных, которая обновляется из устаревшего приложения. Я хотел бы использовать очередь SQL Service Broker, чтобы при обновлении записи сообщение помещалось в очередь (с помощью триггера или чего-то еще).

Мне бы хотелось иметь длинное приложение (служба Windows, написанное на .NET), которое постоянно "слушает" очередь, чтобы захватить сообщения и обработать их для другого приложения.

Я нашел несколько примеров кода в Интернете и просто хотел получить некоторые данные о том, является ли код прочным или нет. Итак, здесь сокращенная версия класса обслуживания 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, никогда не будет таймаутом - внутри бесконечного цикла - заставляет меня немного нервничать.

Ответ 1

Ваш сервис не будет отключен, если вы находитесь в бесконечном цикле. Вы должны проверить условие выхода, установить, когда служба получает сообщение об отключении. Вы можете добавить тайм-аут в WAITFOR, чтобы вы могли проверить, нужно ли закрывать. Вы также должны проверить это на каждой обработанной строке.

Я использовал 2-секундный сон для задержки, но выполнение 2-секундного тайм-аута на WAITFOR выполнит то же самое.

У службы есть 30 секунд до завершения работы или Windows будет считать, что она застряла.