Question

J'ai actuellement une base de données mise à jour à partir d'une application héritée. J'aimerais utiliser une file d'attente SQL Service Broker afin que, lorsqu'un enregistrement est mis à jour, un message soit placé dans la file d'attente (à l'aide d'un déclencheur ou de quelque chose).

J'aimerais ensuite disposer d'une application à exécution longue (service Windows écrit en .NET) qui écoute en permanence "l'écoute". dans la file d’attente pour récupérer les messages et les traiter pour une autre application.

J'ai trouvé un exemple de code sur le Web et je voulais juste savoir si le code est solide ou non. Voici donc une version abrégée de la classe de service 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'en penses-tu? Le code fonctionne exactement comme je le souhaite. Mais l'idée de créer un nouveau thread contenant une commande SQL ne se terminera jamais - à l'intérieur d'une boucle infinie - me rend un peu nerveuse.

Était-ce utile?

La solution

Votre service ne s’arrêtera pas proprement si vous êtes dans une boucle infinie. Vous devriez rechercher une condition de sortie, définie lorsque le service reçoit le message d'arrêt. Vous pouvez ajouter un délai d’attente à WAITFOR pour pouvoir vérifier si vous devez arrêter ou non. Vous devriez également vérifier ceci sur chaque ligne traitée.

J'ai utilisé un délai de 2 secondes pour le délai, mais un délai d'attente de 2 secondes sur WAITFOR permettrait d'obtenir le même résultat.

Un service a 30 secondes pour s’arrêter ou Windows le considère comme bloqué.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top