2009-09-17 11 views
6

Por lo que puedo ver en la documentación, la forma en que debe verificar si hay mensajes en una cola de mensajes es usar el método Peek. Luego confía en que falla con una excepción MessageQueueException para informarle que la cola estaba vacía.¿Puedo echar un vistazo al MSMQ vacío sin obtener una excepción?

public bool IsQueueEmpty() 
    { 
     bool isQueueEmpty = false; 
     MessageQueue myQueue = new MessageQueue(".\\myQueue"); 

     try 
     { 
      myQueue.Peek(new TimeSpan(0)); 
      isQueueEmpty = false; 
     } 

     catch(MessageQueueException e) 
     { 
      if (e.MessageQueueErrorCode == 
       MessageQueueErrorCode.IOTimeout) 
      { 
       isQueueEmpty = true; 
      } 
     } 
     return isQueueEmpty; 
    } 

Siempre han dicho - y han experimentado - Excepciones que son costosos, y no debe utilizarse para las operaciones normales. Así que mis preguntas son:

  • Son mis suposiciones que depender de agarrar la MessageQueueException es una operación costosa correcta?

  • ¿Hay alguna manera de verificar sincrónicamente si hay mensajes en una cola sin tener que depender de excepciones?

estoy trabajando con el espacio de nombres System.Messaging en C#, pero si yo tendría que ir sin gestionar para resolver este que podría ser una opción. Y tenga en cuenta que quiero una solución sin usar WCF con MSMQ.

Respuesta

1

Actualización: No afirmo que el rendimiento no es importante. Pero creo que la comunicación entre procesos es muy costosa en comparación con la excepción.

Antes de la actualización:

  • Creo que en el contexto de la comunicación entre procesos (que es lo que hace msmq) el costo de excepción es poco importante. Prueba si quieres estar seguro.
  • No lo creo.
+0

Pasamos mensajes a través de una serie de servicios donde utilizamos colas entre ellos. Queremos tener el mayor rendimiento posible, por lo que no es poco importante, pero hasta ahora tenemos un rendimiento lo suficientemente bueno. –

+0

Esperaré para ver si recibo algún otro comentario, pero si no lo hago, aceptaré su respuesta: | –

-1

MSMQ no es enteramente comunicación entre procesos. La comunicación entre procesos se realiza principalmente en una sola máquina, pero se puede usar msmq para diferentes computadoras que se comunican. Entrega garantizada, con la otra cara de tener en el mismo sistema operativo.

-2

¿qué tal mq.GetAllMessages tratando(). Longitud> 0

+4

¿De verdad? ¿Incluso cuando su cola puede contener 1000 o 10.000 de mensajes grandes? Es como comer todo el supermercado vacío solo porque quiere saber si le quedan manzanas. –

11
  • Sí Tiene usted razón en el supuesto de que las excepciones son costosos. En realidad, es el lanzamiento lo que es caro, no la captura. Es normal que una cola esté vacía a veces y un estado normal no debe generar una excepción.

  • Al usar MessageQueue.GetMessageEnumerator2 podríamos usar el enumerador para determinar si una cola está vacía o no, sin cargar todos los mensajes. Con este enfoque, nunca cargaríamos más de un mensaje.

Ejemplo:

private static bool IsQueueEmpty(MessageQueue queue) 
{ 
    using (var enumerator = queue.GetMessageEnumerator2()) 
    { 
     return !enumerator.MoveNext(); 
    } 
} 

o para implementar la ojeada que devuelve un valor nulo si la cola de mensajes está vacía (no probado, pero debería funcionar)

private static Message Peek(MessageQueue queue) 
{ 
    using (var enumerator = queue.GetMessageEnumerator2()) 
    { 
     return enumerator.MoveNext() ? enumerator.Current : null; 
    } 
} 

Se utilizó un código como el original verifique alrededor de veinte colas diferentes.Desde que cambiamos de la implementación original a la que sugiero, la velocidad de nuestras importaciones aumentó drásticamente, ya que la CPU podría usarse más para procesar mensajes en lugar de procesar lanzamientos.

+0

Esta debería ser la respuesta aceptada. –

Cuestiones relacionadas