Pregunta

¿Hay alguna manera de comprobar si un MSMQ pública está vacía? Para una MSMQ privada es fácil:

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

¿Cómo puedo hacer la misma comprobación para un público MSMQ? Si trato de comprobar un MSMQ pública con el código anterior me da un error en el pico:

System.ArgumentOutOfRangeException:. La longitud puede no ser menor que cero

¿Fue útil?

Solución

El método Peek sólo está disponible en equipos remotos cuando se utiliza un nombre de formato directo para acceder a la cola. Usted debe ser capaz de usar el mismo código, siempre y cuando usted no está confiando en los servicios de directorio para llegar a la cola.

nombres de cola directos generalmente buscan algo como: DIRECT=URLAddressSpecification/QueueName

Otros consejos

Me acaba de empezar a trabajar con colas de mensajes, pero mi compañero de trabajo tiene esta buena manera de comprobar si una cola está vacía:

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

La ventaja de usar este método es que no produce una excepción, y no creo que se requiere para esperar un tiempo de espera que se produzca.

Leo, seguro de eso? No puede utilizar un nombre de ruta con un control remoto Peek? El error devuelto no dice nombre de formato no válido, lo que cabría esperar si ese fuera el caso. De hecho, el error parece estar en la "falsa isQueueEmpty =" línea - el try / catch no diferencia entre la mirada y las líneas isQueueEmpty. Apuesto a la llamada isQueueEmpty está recibiendo una excepción que se traduce en un número negativo. Ahora su solución, sin embargo, puede ser correcto - un montón de llamadas remotas en MSMQ requieren nombres de formato en lugar de nombres de ruta. Así que si se utiliza un nombre de formato para crear myQueue, la isQueueEmpty debería funcionar.

Saludos

John Breakwell

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top