Bonjour à tous,

Je suis en train de mettre en place un monitoring sur certaines tables d'une base Sql Server, j'ai donc créé une Queue et un Service côté Sql Server puis côté application j'ai utilisé 2 façon de faire.
La première utilise le SqlDepency et l'abonnement sur événement OnChange de celui-ci pour alerter d'un nouveau message et la seconde le SqlNotificationRequest sur la SqlCommand exécutée puis un deuxième SqlCommand avec l'instruction "WAITFOR (RECEIVE * FROM NameQueue);" qui est exécuté en asyncrhone via AsynCallback.

Les 2 méthodes fonctionnent mais je rencontre un soucis avec chacune d'elle :
Pour la première méthode (SqlDepency), lorsque l'événement OnChange est levé, il faut se réabonner à l'événement pour le prochain message. Il faut donc faire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
SqlDependency.Stop(connectionString, "QueueName");
SqlDependency.Start(connectionString, "QueueName");
A la première réception d'un message, rien n'a signaler, l'abonnement se fait sans problème.
A partir de la deuxième réception, la méthode SqlDependency.Stop(...) met beaucoup plus de temps que la première fois, parfois jusqu'à 30 secondes et ensuite l'abonnement est recréé. Je n'arrive pas à l'expliquer et cela pose problème car si un message arrive pendant le temps où l'abonnement n'est pas créé, il ne pourra pas être traité par l'application même si l'abonnement est recréé ensuite.

Pour la deuxième méthode (SqlNotificationRequest + AsyncCallback), le problème est différent, l'abonnement est bien recréé à chaque fois mais lors de la fermeture de l'application ou de la ConnectionString, la Conversation côté Sql Server reste active et ne se ferme pas. J'ai essayé de récupérer le conversation_handle qui est créé mais je n'ai pas trouvé une façon propre de le faire. La conséquence est que lorsque l'application se relance, une nouvelle Conversation est recréé mais lors de la réception d'un message, celui-ci est traité 2 fois car la Conversation précédente est resté ouverte.

Si quelqu'un à une solution ou une idée sur les problèmes.

Merci par avance.