2012-01-19 10 views
6

Estoy utilizando el marco POJO impulsado por mensajes de Spring (y DefaultMessageListenerContainer en particular) para escuchar varias colas y temas.¿Cómo puedo controlar la velocidad a la que Spring recibe de una cola?

En el caso de una cola en particular, hay una necesidad de reducir la velocidad a la que drenar la cola, en el orden de un mensaje cada cinco minutos. El procesamiento real de los mensajes es una operación de segundo orden, pero me gustaría que el oyente permanezca inactivo durante algún tiempo entre los mensajes.

He creado un poco de un truco, pero definitivamente no es óptimo: lo que he hecho es establecer la concurrencia máxima en 1 y agregar un Thread.sleep(..) después de procesar cada mensaje. Me gustaría encontrar una forma de utilizar el DefaultMessageListenerContainer para esperar entre intentos de recepción, en lugar de hacer que el controlador espere durante el procesamiento de un mensaje.

Había considerado si había un ScheduledExecutor que ayudaría, pero me doy cuenta de que la regulación tendría que hacerse donde se producen las tareas. ¿Existe algún método del DefaultMessageListenerContainer que pueda anular para lograr lo que busco?

Respuesta

0

No estoy seguro para el 100%, pero creo que receiveTimeout es lo que quiere.

<bean id="blahContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> 
    .... 
    <!-- 300000 = 5 * 60 * 1000 == 5 min --> 
    <property name="receiveTimeout" value="300000"/> 
</bean> 

receiveTimeout acepta tiempo de espera en milisegundos, se puede leer más sobre esto en javadocs

+1

A menos que esté equivocado, creo que te estás refiriendo a 'receiveTimout'. Esta propiedad intenta recibir de una cola durante el tiempo especificado antes de destruir el 'MessageConsumer'. – Ray

+0

oh, sí, tienes razón, yo estaba por receiveTimeout ( – ruslan

+3

) Debes editar tu respuesta si es incorrecta. – Gray

3

Una alternativa para modificar el comportamiento de su consumidor sería hacer uso de Apache Camel para retrasar los mensajes en que una específica cola.

http://camel.apache.org/delayer.html describe la funcionalidad del patrón Camel Delayer. Así por ejemplo:

<route> 
    <from uri="jms:YOURQUEUE"/> 
    <delay> 
     <constant>1000</constant> 
    </delay> 
    <to uri="jms:DELAYEDQUEUE"/> 
</route> 

Donde entonces usted consumiría el DELAYEDQUEUE y todos los mensajes se retrasarían por 1 segundo.

4

Dependiendo del proveedor de la cola, es posible que pueda establecer una tarifa máxima para los consumidores que consumen sus colas.

Por ejemplo, en hornetQ usted configura esto en la fábrica de conexiones usando consumer-max-rate.

Cuestiones relacionadas