Pregunta

Estoy tratando de implementar pruebas de rendimiento en ActiveMQ, por lo que he configurado un productor y consumidor básico para enviar y recibir mensajes a través de una cola. He creado un productor sin problemas, consiguiendo que escriba un número específico de mensajes en la cola:

 for(int i = 0; i < numberOfMessages; i++){
                try{
                    String message = generateText(sizeOfMessage);
                    produceMessage(message);
                }
                catch (Exception e) {
                    logger.error("Caught exception while sending message", e);
                }
            }

Esto continúa hasta su finalización sin problemas y lo he confirmado con verificaciones en el sitio web de administración, que tienen la cantidad correcta de mensajes pendientes.

El problema ocurre cuando intento recibir los mensajes de la cola. Al usar un consumidor simple para leer de la cola, leerá una cantidad variada de mensajes de la cola, pero luego se detendrá cuando intente recibir uno de los mensajes. Puedo ver que todavía hay mensajes en la cola para ser leídos, pero el cliente no progresará pasando uno de los mensajes. Estoy usando un método simple para recibir los mensajes:

Message message = jmsTemplate.receive();

y funciona para algunos mensajes (aproximadamente 20-30) pero luego solo se bloquea. Me sugirieron que algunos de los caracteres en el mensaje pueden ser un carácter de escape (estaba usando una cadena aleatoria de longitud variable, debido a que esto es solo una prueba de rendimiento, en realidad no envío ningún contenido), así que cambié todos los mensajes a la misma cadena, que es una repetición del char '2' y todavía no tiene suerte. Estoy usando la configuración de Spring para cargar todos los componentes necesarios para acceder a la cola ActiveMQ, y la cola se está ejecutando en mi host local.

¿Fue útil?

Solución

Todavía no hay muchos puntos de vista sobre esto, pero para referencia futura si alguien tiene el mismo problema, he encontrado la solución. La configuración de activeMQ limita la cantidad de memoria utilizada por los remitentes y receptores antes de ralentizarlos, los valores predeterminados que se me dieron fueron:

<systemUsage>
            <systemUsage>
                <memoryUsage>
                    <memoryUsage limit="20 mb"/>
                </memoryUsage>
                <storeUsage>
                    <storeUsage limit="1 gb" name="foo"/>
                </storeUsage>
                <tempUsage>
                    <tempUsage limit="100 mb"/>
                </tempUsage>
            </systemUsage>
        </systemUsage>

Eliminé esta configuración por completo y ahora funciona como un sueño. Estoy llevando a cabo pruebas de rendimiento, por lo que es posible que desee poner sus propias restricciones, ¡pero esta fue definitivamente la causa de mis problemas!

Otros consejos

Es un problema clásico con la mensajería; Qué hacer con los consumidores lentos. Las versiones más recientes de FWIW de ActiveMQ como 5.2 le permiten poner en cola en el disco en lugar de bloquear a los productores cuando la memoria está baja

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