web-dev-qa-db-fra.com

Rabbbitmq: les messages restent "non reconnus"

My Java Application envoie des messages à la Rabbitmq Exchange, puis échange des messages redirige vers la file d'attente contraignée. J'utilise Springframework AMQP Java Plugin avec Rabbitmq.

Le problème: le message vient à la file d'attente, mais il reste dans l'état "non reconnu", il ne devient jamais "prêt".

Quelle pourrait être la raison?

19
sunny

Un message non acquitté implique qu'il a été lu par votre consommateur, mais le consommateur n'a jamais renvoyé une ACK au courtier rabbbitmq pour dire qu'il a fini de traiter.

Je ne connais pas trop haut avec le plugin-cadre de printemps, mais quelque part (pour votre consommateur), vous déclarerez votre file d'attente, cela pourrait ressembler à ceci (tiré de http://www.rabbitmq.com/tatudials /Tutorial-Two-java.html ):

channel.queueDeclare(queueName, ....)

ensuite, vous allez configurer votre consommateur

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

aCKMODE ci-dessus est un booléen, en le fixant à FALSE, nous disons explicitement à la Rabbitmq que mon consommateur accusera chaque message à chaque message. Si ce drapeau a été défini sur true, vous ne verriez pas le nombre non reconditionné dans Rabbitmq, plutôt dès que le consommateur a lu le message offert (c'est-à-dire que cela a été livré au consommateur, il le supprimera de la file d'attente).

Pour reconnaître un message, vous feriez quelque chose comme ça:

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 vous pouvez publier une partie de votre code de consommateur, je pourrais peut-être vous aider davantage ... mais dans le même temps, jetez un coup d'œil à blockingQueconsumer Spécifiquement: le constructeur que vous verrez que vous pouvez définir le - AcknowLeDGemode et jetez un coup d'oeil sur le prochainMessage () Cela renvoie un objet de message qui contient une méthode appelée getdeliveryTag () Cela reviendra une longue qui est l'identifiant que vous renvoyez sur le basicack

18
kzhen

Juste pour ajouter mes 2 cents pour une autre raison possible des messages séjournant dans un état non acquitté, même si le consommateur veille à utiliser la méthode de base.

Parfois, plusieurs instances d'un processus avec une connexion de rabbbitmq ouverte restent en cours d'exécution, dont l'une peut provoquer un message bloquée dans un état non reconditionné, empêchant ainsi une autre instance du consommateur de réaménager ce message.

Vous pouvez accéder à la console de gestion de la rabbbitmq (pour une machine locale ceci devrait être disponible à Localhost: 15672) et vérifiez si plusieurs instances reçoivent la maintien du canal ou si seule une seule instance est actuellement active:

RabbitMQ Connections

Trouvez la tâche de fonctionnement redondante (dans ce cas - Java) et terminez-la. Après avoir supprimé le processus de voyous, vous devez voir que le message saute à nouveau à l'état prête.

11
Shlomi Uziel