Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top