SQL Service Broker и .NET Windows Service - лучшие практики? - PullRequest
12 голосов
/ 20 января 2009

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

7 голосов
/ 20 января 2009

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

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

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

...