.net - start - sqllocaldb share
SQL Service Broker y.NET Windows Service: ¿mejores prácticas? (1)
Actualmente tengo una base de datos que se actualiza a partir de una aplicación heredada. Me gustaría utilizar una cola de SQL Service Broker para que cuando se actualice un registro, se coloque un mensaje en la cola (utilizando un disparador o algo así).
Me gustaría tener una aplicación de larga ejecución (servicio de Windows escrito en .NET) que esté constantemente "escuchando" la cola para tomar los mensajes y procesarlos para otra aplicación.
Encontré un código de muestra en la web y solo quería obtener información sobre si el código es sólido o no. Entonces, aquí hay una versión abreviada de la clase de servicio de 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
}
}
}
}
}
}
¿Qué piensas? El código funciona exactamente como yo quiero. Pero la idea de hacer girar un nuevo hilo que contenga un comando SQL nunca se desconectará, dentro de un ciclo infinito, me pone un poco nervioso.
Su servicio no se apagará limpiamente si se encuentra en un ciclo infinito. Debería verificar una condición de salida, activada cuando el servicio recibe el mensaje de apagado. Puede agregar un tiempo de espera al WAITFOR para que pueda verificar si se debe apagar. También debe verificar esto en cada fila procesada.
He usado un sueño de 2 segundos para la demora, pero hacer un tiempo de espera de 2 segundos en WAITFOR lograría lo mismo.
Un servicio tiene 30 segundos para el apagado o Windows lo considerará atascado.