SQL Service Broker e .NET Windows Service - Melhores práticas?
-
19-08-2019 - |
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
fazSoluçã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.