2009-01-20 17 views
12

Ich habe derzeit eine Datenbank, die von einer Legacy-Anwendung aktualisiert wird. Ich möchte eine SQL Service Broker-Warteschlange verwenden, so dass beim Aktualisieren eines Datensatzes eine Nachricht in die Warteschlange gestellt wird (mit einem Trigger oder etwas).SQL Service Broker und .NET Windows Service - Best Practices?

Ich hätte dann gerne eine lange laufende Anwendung (Windows-Dienst in .NET geschrieben), die ständig auf die Warteschlange "hört", um die Nachrichten zu greifen und sie für eine andere Anwendung zu verarbeiten.

Ich habe einige Beispielcode im Web gefunden, und wollte nur eine Eingabe erhalten, ob der Code fest ist oder nicht. Also, hier ist eine abgekürzte Version der Windows-Service-Klasse:

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 
        } 
       } 
      } 
     } 
    } 
} 

Was denken Sie? Der Code funktioniert genau so, wie ich es möchte. Aber die Idee, einen neuen Thread, der einen SQL-Befehl enthält, auszuwerfen, wird nie auslaufen - innerhalb einer Endlosschleife - macht mich etwas nervös.

Antwort

7

Ihr Dienst wird nicht ordnungsgemäß heruntergefahren, wenn Sie sich in einer Endlosschleife befinden. Sie sollten nach einer Beendigungsbedingung suchen, die aktiviert wird, wenn der Dienst die Nachricht zum Herunterfahren erhält. Sie können der WAITFOR ein Zeitlimit hinzufügen, damit Sie überprüfen können, ob Sie heruntergefahren werden sollten. Sie sollten dies auch für jede verarbeitete Zeile überprüfen.

Ich habe einen 2-Sekunden-Schlaf für die Verzögerung verwendet, aber eine 2-Sekunden-Timeout auf der WAITFOR würde das gleiche erreichen.

Ein Dienst hat 30 Sekunden zum Herunterfahren oder Windows wird es feststecken.

Verwandte Themen