Domanda

C'è un modo per verificare se un MSMQ pubblico è vuota? Per un MSMQ privata è 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;
        }

Come avrei fatto lo stesso controllo per un pubblico MSMQ? Se provo per controllare un MSMQ pubblico con il codice di sopra di esso mi dà un errore sul picco:

System.ArgumentOutOfRangeException:. Lunghezza non può essere minore di zero

È stato utile?

Soluzione

Il metodo Peek è disponibile solo su macchine remote quando si utilizza un nome di formato diretto per accedere alla coda. Si dovrebbe essere in grado di utilizzare lo stesso codice, fino a quando non sei basandosi su servizi di directory per arrivare alla coda.

nomi delle code diretti generalmente simile a: DIRECT=URLAddressSpecification/QueueName

Altri suggerimenti

Ho appena iniziato a lavorare con il messaggio di code, ma il mio collega ha questo bel modo per controllare se una coda è vuota:

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

Il vantaggio di questo metodo è che non un'eccezione, e non credo che richiede di attendere un timeout che si verifichi.

Leo, è sicuro di questo? Non è possibile utilizzare un nome di percorso con un telecomando Peek? L'errore riscontrato non dice il nome formato non valido, che ci si aspetterebbe se fosse il caso. In realtà l'errore sembra essere sul "isQueueEmpty = false" linea - il try / catch non fa differenza fra il peek e le linee isQueueEmpty. Scommetto che la chiamata isQueueEmpty sta ricevendo un'eccezione che si traduce in un numero negativo. Ora la vostra soluzione, però, può essere corretto - un sacco di chiamate remote in MSMQ richiede nomi di formato invece dei nomi di percorso. Quindi, se si utilizza un nome di formato per la creazione myQueue, l'isQueueEmpty dovrebbe funzionare.

Saluti

John Breakwell

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top