Pregunta

Actualmente tengo una base de datos que se actualiza desde 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 (usando un disparador o algo así).

Entonces me gustaría tener una aplicación de larga ejecución (servicio de Windows escrito en .NET) que esté constantemente "escuchando" a 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é te parece? El código funciona exactamente como yo quiero. Pero la idea de desencadenar un nuevo hilo que contiene un comando SQL nunca se agotará, dentro de un bucle infinito, me pone un poco nervioso.

¿Fue útil?

Solución

Su servicio no se cerrará limpiamente si está en un bucle infinito. Debería estar buscando 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 debería estar cerrando. También debe verificar esto en cada fila procesada.

He usado un sueño de 2 segundos para el retraso, pero hacer un tiempo de espera de 2 segundos en el WAITFOR lograría lo mismo.

Un servicio tiene 30 segundos para apagarse o Windows lo considerará atascado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top