Meine Java-Anwendung sendet Nachrichten zu RabbitMQ exchange, dann leitet exchange Nachrichten an gebundenen Warteschlange.
Ich benutze Springframework AMQP java-plugin mit RabbitMQ.
Das problem: kommt die Meldung in die Warteschlange, aber es bleibt in "Uneingestandene" - Zustand, es wird nie "Fertig".
Was könnte der Grund sein?
InformationsquelleAutor sunny | 2012-08-12
Eine Unbestätigte Meldung besagt, dass es gelesen wurde, indem Sie Ihre Verbraucher, aber der Verbraucher hat nie zurück gesendet, eine Bestätigung an den RabbitMQ-broker zu sagen, dass es fertig ist Verarbeitung.
Ich bin nicht allzu vertraut mit dem Spring-Framework-plugin, aber irgendwo (für den Verbraucher) werden Sie die Erklärung Ihrer Warteschlange, es könnte wie folgt Aussehen (entnommen aus http://www.rabbitmq.com/tutorials/tutorial-two-java.html):
dann Sie Ihre setup Verbraucher
ackMode oben ist ein boolean auf false setzen, wir sind ausdrücklich zu sagen, RabbitMQ, dass meine Verbraucher wird bestätigen können jede Nachricht gegeben ist. Wenn dieses flag auf true festgelegt war, dann würden Sie nicht sehen, die Unbestätigten zählen in RabbitMQ, sondern sobald ein Verbraucher hat die Nachricht Lesen ab (ich.e es wurde geliefert, um den Verbraucher zu entfernen, entfernen Sie es aus der Warteschlange).
Quittierung einer Nachricht, die Sie tun würde, so etwas wie dieses:
Wenn Sie post einige Ihrer Verbraucher-code, dann könnte ich vielleicht weiter helfen...aber in der Zwischenzeit werfen Sie einen Blick auf BlockingQueueConsumer speziell: der Konstruktor Sie werden sehen, dass Sie können die AcknowledgeMode und werfen Sie auch einen Blick auf die nextMessage() gibt eine Message-Objekt enthält eine Methode namens getDeliveryTag() dies gibt eine Lange, das ist die ID, die Sie senden möchten zurück auf die basicAck
InformationsquelleAutor kzhen
Nur hinzufügen, meine 2 cents für ein weiterer möglicher Grund für die Nachrichten bleiben in einer unbestätigte Status, auch wenn der Verbraucher stellt sicher, dass die basicAck Methode-
Manchmal mehrere Instanzen eines Prozesses mit offenem RabbitMQ Verbindung bleiben, von denen kann dazu führen, eine Meldung zu bekommen, stecken in einem unbestätigten Zustand, verhindern, dass eine andere Instanz, der Verbraucher, der jemals refetch diese Meldung.
Können Sie den Zugriff auf die RabbitMQ-management-console (für eine lokale Maschine dieses sollte unter localhost:15672), und überprüfen Sie, ob mehrere Instanzen man halt den Kanal, oder, wenn nur eine einzige Instanz ist derzeit aktiv:
Finden, die redundant ausgeführte Aufgabe (in diesem Fall java) und es zu beenden. Nach dem entfernen der rogue-Prozess, sollten Sie sehen die Meldung springt in den Bereit-Zustand wieder.
InformationsquelleAutor Shlomi Uziel