Frage

Im Moment habe ich eine Datenbank, die von einer Legacy-Anwendung aktualisiert wird. Ich möchte eine SQL Service Broker-Warteschlange verwenden, so dass, wenn ein Datensatz aktualisiert wird, wird eine Meldung in die Warteschlange gestellt wird (unter Verwendung eines Trigger oder etwas).

dann mag ich eine lange laufende Anwendung (Windows-Dienst in .NET geschrieben) haben, die ständig an die Warteschlange „Hören“, um die Nachrichten zu packen und sie für eine andere Anwendung zu verarbeiten.

Ich habe einige Beispiel-Code im Internet gefunden und wollte nur auf eine Eingabe erhalten, ob der Code fest oder nicht. So, hier ist eine gekü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 will. Aber die Idee des Spinnens einen neuen Thread aus, die einen SQL-Befehl enthält, wird nie out-Zeit - innerhalb einer Endlosschleife -. Macht mich ein wenig nervös

War es hilfreich?

Lösung

Ihr Dienst wird nicht Herunterfahren sauber, wenn Sie in einer Endlosschleife sind. Sie sollten für eine Exit-Bedingung werden überprüft, eingestellt, wenn der Dienst der Shutdown-Meldung erhält. Sie können einen Timeout auf die WAITFOR hinzufügen, so dass Sie überprüfen können, wenn Sie heruntergefahren werden soll. Sie sollten dies auch auf jeder verarbeiteten Zeile überprüfen.

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

Ein Dienst hat 30 Sekunden zum Herunterfahren oder Windows wird es für stecken.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top