2012-08-12 10 views
10

La mia applicazione Java invia messaggi a RabbitMQ exchange, quindi scambia i messaggi di reindirizzamento alla coda bindata. Uso il plug-in Java AMQP di Springframework con RabbitMQ.RabbitMQ: i messaggi rimangono "Non riconosciuti"

Il problema: il messaggio arriva in coda, ma rimane nello stato "Non riconosciuto", non diventa mai "Pronto".

Quale potrebbe essere il motivo?

risposta

13

Un messaggio non riconosciuto implica che è stato letto dal consumatore, ma il consumatore non ha mai inviato un ACK al broker RabbitMQ per dire che ha terminato l'elaborazione.

io non sono eccessivamente familiarità con il plugin Spring Framework, ma da qualche parte (per il vostro consumatore) sarete dichiarando la coda, che potrebbe essere simile a questo (tratto da http://www.rabbitmq.com/tutorials/tutorial-two-java.html):

channel.queueDeclare(queueName, ....) 

poi si imposterà la consumatore

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

ackMode sopra è un valore booleano, impostandolo su false, stiamo esplicitamente dicendo a RabbitMQ che il mio consumatore riconoscerà ogni messaggio è dato. Se questo flag fosse impostato su true, non vedresti il ​​conteggio non riconosciuto in RabbitMQ, piuttosto appena un consumatore ha letto il messaggio (cioè è stato consegnato al consumatore che lo rimuoverà dalla coda).

Riconoscere un messaggio si farebbe qualcosa di simile:

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 

Se si riesce a caricare alcune codice del consumo, allora potrei essere in grado di aiutare ulteriormente ... ma nel frattempo dai uno sguardo allo BlockingQueueConsumer in particolare: il costruttore vedrai che puoi impostare il AcknowledgeMode e dare anche un'occhiata al nextMessage() questo restituirà un oggetto Message che contiene un metodo chiamato getDeliveryTag() che restituirà un Long che è il ID che invierai di nuovo su basicAck

4

solo aggiungere i miei 2 centesimi per un altro motivo possibile per i messaggi che soggiornano in uno stato non riconosciuta, anche se il consumatore fa in modo di utilizzare il metodo-basicAck

volte più istanze di un processo con una connessione aperta RabbitMQ rimanere in esecuzione, uno dei quali può causare il blocco di un messaggio in uno stato non riconosciuto, impedendo a un'altra istanza del consumatore di recuperare nuovamente questo messaggio.

È possibile accedere alla console di gestione RabbitMQ (per una macchina locale questo dovrebbe essere disponibile al localhost: 15672), e verificare se più istanze entrare in possesso del canale, o anche solo una singola istanza è attualmente attivo:

RabbitMQ Connections

Trovare l'attività in esecuzione ridondante (in questo caso - java) e terminarla. Dopo aver rimosso il processo canaglia, dovresti vedere che il messaggio passa nuovamente allo stato Pronto.

Problemi correlati