Question

Y at-il moyen de vérifier si un MSMQ public est vide? Pour un MSMQ privé, il est facile:

private bool IsQueueEmpty(string path)
        {
            bool isQueueEmpty = false;
            var myQueue = new MessageQueue(path);
            try
            {
                myQueue.Peek(new TimeSpan(0));
                isQueueEmpty = false;
            }
            catch (MessageQueueException e)
            {
                if (e.MessageQueueErrorCode == MessageQueueErrorCode.IOTimeout)
                {
                    isQueueEmpty = true;
                }
            }
            return isQueueEmpty;
        }

Comment puis-je faire la même vérification pour un public MSMQ? Si je tente de vérifier un MSMQ public avec le code ci-dessus, il me donne une erreur sur la crête:

System.ArgumentOutOfRangeException:. La longueur ne peut être inférieur à zéro

Était-ce utile?

La solution

La méthode Peek est disponible uniquement sur des machines distantes lorsque vous utilisez un nom de format direct pour accéder à la file d'attente. Vous devriez être en mesure d'utiliser le même code, tant que vous n'êtes pas compter sur les services d'annuaire pour vous rendre à la file d'attente.

Les noms de file d'attente directe regardent généralement quelque chose comme: DIRECT=URLAddressSpecification/QueueName

Autres conseils

Je viens de commencer à travailler avec Queues message mais mon collègue a cette façon agréable pour vérifier si une file d'attente est vide:

if (MessageQueue.Exists(fullQueuePath))
{
    // FYI, GetMessageQueue() is a helper method we use to consolidate the code
    using (var messageQueue = GetMessageQueue(fullQueuePath))
    {
        var queueEnum = messageQueue.GetMessageEnumerator2();

        if (queueEnum.MoveNext())
        {
            // Queue not empty
        }
        else
        {
            // Queue empty
        }
    }
}

L'avantage de cette méthode est qu'elle ne jette pas une exception, et je ne pense pas que vous devez attendre un délai d'attente de se produire.

Leo, vous sûr? Vous ne pouvez pas utiliser un nom de chemin avec un Peek à distance? L'erreur renvoyée ne dit pas le nom de format non valide, ce qui serait attendu si tel était le cas. En fait, l'erreur semble être sur la ligne « isQueueEmpty = false » - le try / catch ne différencie pas entre le coup d'oeil et les lignes de isQueueEmpty. Je parie que l'appel isQueueEmpty reçoit une exception qui se traduit par un nombre de négatif. Maintenant, votre solution, cependant, peut être correct - beaucoup d'appels à distance dans MSMQ exigent des noms de format au lieu des noms de chemin. Donc, si vous utilisez un nom de format pour la création myQueue, le isQueueEmpty devrait fonctionner.

Vive

John Breakwell

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