2009-01-20 19 views
12

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í).SQL Service Broker y .NET Windows Service: ¿mejores prácticas?

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.

He encontrado algunos ejemplos de código en la web y solo quería obtener información sobre si el código es sólido o no. Así pues, aquí es 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é opinas? 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.

Respuesta

7

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 utilizado un segundo sueño para la demora, pero hacer un tiempo de espera de 2 segundos en el WAITFOR lograría lo mismo.

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

Cuestiones relacionadas