Domanda

Al momento ho un database che viene aggiornato da un'applicazione legacy. Vorrei utilizzare una coda di SQL Service Broker in modo che quando un record viene aggiornato, un messaggio viene inserito nella coda (utilizzando un trigger o qualcosa del genere).

Vorrei quindi avere un'applicazione di lunga durata (servizio Windows scritto in .NET) che è costantemente in "ascolto". alla coda per afferrare i messaggi ed elaborarli per un'altra applicazione.

Ho trovato del codice di esempio sul Web e volevo solo ottenere qualche input sul fatto che il codice sia solido o meno. Quindi, ecco una versione abbreviata della classe di servizio di 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
                    }
                }
            }
        }
    }
}

Cosa ne pensi? Il codice funziona esattamente come lo voglio. Ma l'idea di far girare un nuovo thread che contiene un comando SQL non scadrà mai - all'interno di un ciclo infinito - mi rende un po 'nervoso.

È stato utile?

Soluzione

Il tuo servizio non si spegnerà in modo pulito se sei in un ciclo infinito. Dovresti verificare una condizione di uscita, impostata quando il servizio riceve il messaggio di arresto. È possibile aggiungere un timeout a WAITFOR in modo da poter verificare se è necessario chiudere. Dovresti anche controllare questo su ogni riga elaborata.

Ho usato un sonno di 2 secondi per il ritardo, ma fare un timeout di 2 secondi sul WAITFOR farebbe la stessa cosa.

Un servizio ha 30 secondi di spegnimento o Windows lo considererà bloccato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top