2012-08-12 22 views
10

Mi aplicación Java envía mensajes al intercambio RabbitMQ, luego intercambia los mensajes de redirección a la cola enlazada. Uso Springframework AMQP java plugin con RabbitMQ.RabbitMQ: los mensajes permanecen "No reconocidos"

El problema: el mensaje llega a la cola, pero permanece en estado "No confirmado", nunca se convierte en "Listo".

¿Cuál podría ser el motivo?

Respuesta

13

Un mensaje no confirmado implica que ha sido leído por su consumidor, pero el consumidor nunca ha enviado un ACK al intermediario RabbitMQ para informarle que ha terminado de procesarlo.

No estoy demasiado familiarizado con el plugin Spring Framework, pero en algún lugar (para su consumo) se le declara su cola, que podría ser algo como esto (tomado de http://www.rabbitmq.com/tutorials/tutorial-two-java.html):

channel.queueDeclare(queueName, ....) 

entonces se quiere configurar su consumo

bool ackMode = false; 
QueueingConsumer consumer = new QueueingConsumer(channel); 
channel.basicConsume(queueName, ackMode, consumer); 

ackMode arriba es un valor lógico, estableciéndolo en falso, estamos diciendo explícitamente a RabbitMQ que mi consumidor va a reconocer cada mensaje que se da. Si este indicador se estableció en verdadero, entonces no vería el conteo no reconocido en RabbitMQ, en vez de que el consumidor haya leído el mensaje (es decir, que haya sido entregado al consumidor, lo eliminará de la cola).

Reconocer un mensaje que haría algo como esto:

QueueingConsumer.Delivery delivery = consumer.nextDelivery(); 
//...do something with the message... 
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false); //the false flag is to do with multiple message acknowledgement 

Si puede publicar algunos de su código de consumo entonces yo podría ser capaz de ayudar aún más ... pero en la media hora Eche un vistazo a BlockingQueueConsumer específicamente: el constructor verá que puede configurar el AcknowledgeMode y también eche un vistazo al nextMessage() esto devolverá un objeto Message que contiene un método llamado getDeliveryTag() que devolverá un Long que es el ID que enviaría en la baseAck

4

Solo para agregar mis 2 centavos por otra posible razón para que los mensajes permanezcan en un estado no reconocido, aunque el consumidor se asegure de utilizar el método baseAck-

A veces, varias instancias de un proceso con una conexión RabbitMQ abierta permanecen activas. uno de los cuales puede hacer que un mensaje se quede atascado en un estado no reconocido, evitando que otra instancia del consumidor vuelva a buscar este mensaje.

Puede acceder a la consola de administración RabbitMQ (para una máquina local este debe estar disponible en localhost: 15672), y comprobar si varias instancias controlar la canal, o si sólo existe una instancia está actualmente activo:

RabbitMQ Connections

Encuentra la tarea de ejecución redundante (en este caso, java) y finalízala. Después de eliminar el proceso deshonesto, debería ver que el mensaje salta nuevamente al estado Listo.

Cuestiones relacionadas