2010-11-25 12 views
5

Estoy usando ActiveMQ en un programa .Net y estoy inundado de eventos de mensajes.¿Cómo puedo reducir la cantidad de mensajes provenientes de ActiveMQ en mi aplicación C#?

En resumen, cuando recibo un evento de cola 'onMessage (IMessage receivedMsg)' pongo el mensaje en una cola interna de la cual los hilos X hacen lo suyo.

Al principio tenía: 'AcknowledgementMode.AutoAcknowledge' al crear la sesión, así que supongo que todos los mensajes en la cola fueron absorbidos y puestos en la cola de la memoria (que es arriesgado ya que con un bloqueo, todo es perdió).

Entonces utilicé: 'AcknowledgementMode.ClientAcknowledge' al crear la sesión, y cuando un trabajador estaba listo con el mensaje, llama al método 'commit()' en el mensaje. Sin embargo, todavía todos los mensajes son absorbidos por la cola.

¿Cómo puedo configurarlo para que SÓLO se procesen o estén en una cola interna una cantidad X de mensajes, y que no todo se "descargue" de inmediato?

+0

Aunque nunca he tocado ActiveMQ, ¿no puedes darle la vuelta a esto: configurar N conversaciones con oyentes ActiveMQ y procesar los mensajes dentro del evento de escucha? –

+0

@will hughes: todo mi programa está escrito de forma asíncrona. Así que incluso el acceso a la base de datos se realiza de forma asíncrona con devoluciones de llamadas. Entonces no puedo quedarme en el evento. – Toad

Respuesta

3

¿Estás en .NET 4.0? Podría usar una BlockingCollection. Establézcalo en la cantidad máxima que pueda contener. Tan pronto como un subproceso intente insertar un elemento en exceso, la operación Agregar se bloqueará hasta que la colección vuelva a estar por debajo del umbral.

Quizás eso lo haría por estrangulamiento?

También hay una API para la aceleración en el marco de Rx, pero no sé cómo se implementa. Si implementa su fuente de cola como observable, esta API estaría disponible para usted, pero no sé si esto satisface sus necesidades.

+0

¡excelente respuesta! Funciona de maravilla. Gracias – Toad

2

Puede establecer la captura previa del cliente para controlar la cantidad de mensajes que se enviará al cliente. Cuando la sesión está en Auto Ack, el cliente solo ackeará un mensaje una vez que haya sido entregado a su aplicación mediante la devolución de llamada de onMessage o mediante una recepción sincrónica. De forma predeterminada, el cliente registrará previamente 1000 mensajes del intermediario; si el cliente falla, estos mensajes se volverían a entregar a otro cliente; esta era una cola; de lo contrario, para un tema solo se descartaría, ya que un tema es un canal basado en difusión. Si configuras la captación previa en uno, tu cliente solo recibirá un mensaje del servidor, y cada vez que finalice tu devolución de llamada aMessage, se enviaría un nuevo mensaje, ya que el cliente aceptaría ese mensaje, es decir, si la sesión está en Auto Ack. modo.

Consulte la página de configuración de NMS para todas las opciones: http://activemq.apache.org/nms/configuring.html

Saludos

Tim. FuseSource.com

+0

bish: Desafortunadamente, incluso si configuré para clientacknowledge, la cola disparará tantos eventos como mensajes hay en la cola. Lo probé con 10.000 messqges en la cola y serán despedidos sin que yo reconozca nada. La única forma de detenerlo es detener el onMessage hasta que lo haya procesado. – Toad

+0

Suena como que su modelo de programación sería más adecuado mediante el uso de llamadas de recepción sincrónicas, luego puede estrangularlo todo lo que quiera. El objetivo del sistema de mensajería es entregar mensajes lo más rápido posible, su aplicación debe lidiar con la aceleración. –

Cuestiones relacionadas