Pergunta

Actualmente tenho um banco de dados que é atualizado a partir de um aplicativo de legado. Eu gostaria de utilizar uma fila de SQL Service Broker para que quando um registro é atualizado, a mensagem é colocada na fila (utilizando um gatilho ou algo assim).

Em seguida, gostaria de ter uma aplicação de longa duração (serviço Windows escrito em .NET) que está constantemente "escuta" para a fila para pegar as mensagens e processá-los para outro aplicativo.

Eu encontrei um código de exemplo na web, e só queria obter algumas informações sobre se o código é sólido ou não. Então, aqui está uma versão abreviada da classe de serviço do 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
                    }
                }
            }
        }
    }
}

O que você acha? O código funciona exatamente da maneira que eu quero. Mas a idéia de girar fora de um novo segmento que contém um comando SQL jamais tempo fora - dentro de um loop infinito -. Me um pouco nervoso

faz
Foi útil?

Solução

O seu serviço não será desligamento limpa se você estiver em um loop infinito. Você deve ser a verificação de uma condição de saída, definir quando o serviço recebe a mensagem de desligamento. Você pode adicionar um tempo limite para o WAITFOR para que você possa verificar se você deve estar parados. Você também deve verificar isso em cada linha processada.

Eu tenho usado um 2 segundo sono para o atraso, mas fazendo um segundo tempo 2 no WAITFOR iria realizar a mesma coisa.

Um serviço tem 30 segundos para desligar ou Windows irá considerá-lo preso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top