Délai d'attente de la méthode MSMQ Receive ()
Ma question d'origine d'un certain temps, il est MSMQ Lente de la File d'attente de Lecturecependant, j'ai avancé à partir de cela et pense maintenant que je sais que le problème un peu plus claire.
Mon code (le bien fait partie d'une bibliothèque open source, je suis en utilisant ressemble à ceci:
queue.Receive(TimeSpan.FromSeconds(10), MessageQueueTransactionType.Automatic);
Qui est à l'aide de la De messagerie.MessageQueue.Recevoir de la fonction et de la file d'attente est un MessageQueue. Le problème est comme suit.
Au-dessus de la ligne de code sera appelé avec le délai spécifié (10 secondes). Le Receive(...)
fonction est une fonction de blocage, et est censé bloquer jusqu'à ce qu'un message arrive dans la file d'attente à laquelle il sera de retour. Si aucun message n'est reçu avant le délai est atteint, il sera de retour à l'expiration du délai. Si un message est dans la file d'attente lorsque la fonction est appelée, elle sera de retour ce message immédiatement.
Cependant, ce qui se passe est que le Receive(...)
fonction est appelée, voyant qu'il n'y a pas de message dans la file d'attente, et donc en attente d'un nouveau message arrive. Lorsqu'un nouveau message arrive (avant le délai), elle n'est pas la détection de ce nouveau message et continue d'attente. Le délai d'attente est finalement frappé, à quel point le code continue et les appels Receive(...)
de nouveau, où il capte le message et les processus.
Maintenant, ce problème se produit uniquement après un certain nombre de jours ou de semaines. Je peux le faire fonctionner à nouveau normalement par la suppression de & recréer la file d'attente. Il arrive sur des ordinateurs différents, et les différentes files d'attente. Donc, il semble que quelque chose est, jusqu'à un certain point quand il se casse la commande/notification capacité de la Receive(...)
fonction utilise.
J'ai vérifié beaucoup de choses différentes, et tout semble normal & n'est pas différent d'une file d'attente qui fonctionne normalement. Il y a beaucoup d'espace disque (13gig libre) et la RAM (environ 350 MO gratuit de 1 GO de ce que je peux dire). J'ai vérifié les entrées de registre qui semblent tous de la même façon que les autres files d'attente, et l'analyseur de performances ne montre pas tout ce qui sort de la normale. J'ai également exécuter le TMQ outil et ne voit rien fait de mal.
Je suis avec Windows XP sur toutes les machines et tous, ils ont le service pack 3 installé. Je ne suis pas d'envoi d'une grande quantité de messages dans les files d'attente, au plus il sera de 1 toutes les 2 secondes, mais généralement beaucoup moins fréquentes que cela. Les messages ne sont que trop petite et nulle part à proximité de la limite de 4 mo.
La seule chose que j'ai remarqué est la p0000001.mq et r0000067.mq fichiers dans C:\WINDOWS\system32\msmq\storage sont à la fois les 4 096 KO cependant, ils sont de cette taille sur d'autres ordinateurs qui ne sont actuellement pas le problème. Le problème ne se produit pas à chaque file d'attente sur l'ordinateur à la fois, que je peux recréer 1 problème de file d'attente sur l'ordinateur et les autres files d'attente le problème persiste.
Je ne suis pas très expérimenté avec MSMQ donc, si vous postez des choses à vérifier pouvez-vous nous expliquer comment vérifier, ou de où je peux trouver plus de détails sur ce que vous parlez.
Actuellement la situation est la suivante:
- Ordinateura - 4 files d'attente normale
- Ordinateurb - 2 files d'attente éprouver de problème, 1 file d'attente normale
- ComputerC - 2 files d'attente connaît problème
- ComputerD - 1 de la file d'attente normale
- ComputerE - 2 files d'attente normale
J'ai donc un grand nombre d'ordinateurs/files d'attente afin de les comparer et de les tester.
source d'informationauteur mike
Vous devez vous connecter pour publier un commentaire.
Une raison quelconque vous n'êtes pas à l'aide d'un gestionnaire d'événement pour écouter les files d'attente? Le Système.Messagerie bibliothèque vous permet d'attacher un gestionnaire de file d'attente au lieu d', si je comprends bien ce que vous faites correctement, le bouclage de Recevoir toutes les 10 secondes. Essayez quelque chose comme ceci:
Nous sommes également à l'aide de NServiceBus et a eu un problème similaire à l'intérieur de notre réseau.
Fondamentalement MSMQ est en utilisant UDP avec deux phases s'engage. Après qu'un message est reçu, il doit être reconnu. Jusqu'à ce qu'il soit reconnu, il ne peut pas être reçu sur le côté client que la transaction n'a pas été finalisé.
Cela a été causé par différentes choses à différents moments pour nous:
- une fois que cela était dû à la Coordinateur de Transactions Distribuées dans l'incapacité de communiquer entre machines comme une mauvaise configuration du pare-feu
- une autre fois, nous avons été cloné à l'aide de machines virtuelles sans sysprep qui fait interne MSMQ id de non-unique et le fait de recevoir un message à une machine et d'accusé de réception à l'autre. Finalement MSMQ chiffres de choses, mais il prend un certain temps.
Espère que cette aide.
Essayer cette
fonction surchargée.
Pour obtenir un curseur pour une MessageQueue, appelez le CreateCursor méthode pour que la file d'attente.
Un Curseur est utilisé avec des méthodes telles que le Peek(TimeSpan, Curseur, PeekAction) et de réception(TimeSpan, Curseur) lorsque vous avez besoin de lire les messages qui ne sont pas à l'avant de la file d'attente. Cela inclut la lecture des messages de manière synchrone ou asynchrone. Les curseurs ne doivent pas être utilisés pour lire le premier message dans une file d'attente.
Lors de la lecture des messages au sein d'une transaction, Message Queuing ne pas faire reculer le mouvement du curseur si la transaction est annulée. Par exemple, supposons qu'il y ait une file d'attente avec deux messages, A1 et A2. Si vous supprimez un message A1 au cours d'une transaction, Message Queuing déplace le curseur sur le message A2. Toutefois, si la transaction est annulée pour une raison quelconque, le message A1 est inséré dans la file d'attente mais le curseur reste au pointage de message A2.
Pour fermer le curseur, appel à Proximité.
Si vous voulez utiliser quelque chose de complètement synchrone et sans incident, vous pouvez tester cette méthode