Frage

Gibt es eine Möglichkeit zu überprüfen, ob eine öffentliche MSMQ leer ist? Für einen privaten MSMQ ist es einfach:

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;
        }

Wie würde ich die gleiche Prüfung für eine öffentliche MSMQ tun? Wenn ich versuche, eine öffentliche MSMQ mit dem Code zu überprüfen darüber mir einen Fehler auf dem Gipfel gibt:

System.ArgumentOutOfRangeException. Die Länge kann nicht weniger als Null

War es hilfreich?

Lösung

Die Peek Methode ist auf Remote-Rechnern nur zur Verfügung, wenn Sie einen direkten Formatnamen verwenden, um die Warteschlange zuzugreifen. Sie sollten den gleichen Code verwenden können, solange Sie nicht auf Verzeichnisdienste angewiesen sind Sie in die Warteschlange zu erhalten.

Direktwarteschlangennamen sehen in der Regel so etwas wie: DIRECT=URLAddressSpecification/QueueName

Andere Tipps

ich arbeite gerade angefangen mit Message Queues, aber meine Mitarbeiter haben diese schöne Art und Weise zu überprüfen, ob eine Warteschlange ist leer:

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
        }
    }
}

Der Vorteil der Verwendung dieser Methode ist, dass es keine Ausnahme werfen, und ich glaube nicht, es erfordert, dass Sie zu warten, ein Timeout auftritt.

Leo, du sicher? Sie können einen Pfadnamen mit einem Remote-Peek verwenden? Der Fehler zurückgegeben sagt nicht ungültigen Format Namen, der zu erwarten wäre, wenn das der Fall ist. In der Tat erscheint der Fehler auf der „isQueueEmpty = false“ Linie zu sein - das try / catch unterscheidet nicht zwischen der Peek und den isQueueEmpty Linien. Ich wette, die isQueueEmpty Aufruf eine Ausnahme empfängt, die zu einer negativen Zahl übersetzt. Jetzt ist Ihre Lösung, kann aber richtig sein - viele Ferngespräche in MSMQ benötigen Formatnamen anstelle von Pfadnamen. Wenn Sie also einen Formatnamen für die Erstellung von myQueue verwenden, sollte die isQueueEmpty arbeiten.

Prost

John Breakwell

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top