2017-10-09 4 views
0

Ich folge dem folgenden Tutorial zum Buchstaben: https://www.rabbitmq.com/tutorials/tutorial-two-java.html.Wie kann ich RabbitMQ unbestätigte Nachrichten zurückgeben?

starte ich den RabbitMQ Server als solche:

docker pull rabbitmq 
docker run -d --hostname my-rabbit-host --name my-rabbit -p 5672:5672 rabbitmq:3 

aus dem Tutorial:

diesen Code verwenden, können wir sicher sein, dass, auch wenn Sie einen Arbeiter mit STRG + C, während sie töten Verarbeitete eine Nachricht, nichts wird verloren gehen. Bald , nachdem der Arbeiter stirbt, werden alle unbestätigten Nachrichten erneut übermittelt.

ich laichen zwei Verbraucher, und wenn ich STRG + C einer von ihnen, der andere läuft man tut nicht erhalten die Nachrichten, die ursprünglich auf dem ehemaligen Verbraucher bestimmt waren. Wie bekomme ich die Nachrichten erneut zugestellt, nachdem STRG + C aus einem der Verbraucher?

Edit: Ich installiere jetzt RabbitMQ über 'brauen', aber ich sehe immer noch das gleiche Problem.

brew update 
brew install rabbitmq 
/usr/local/sbin/rabbitmq-server & 
+0

Von dem, was Sie beschreiben, sollte es Out-of-the-Box funktionieren. Hast du anstelle des 'DoWork'-Zeugs geschlafen und den Konsumenten während des Schlafes gestoppt? (offensichtlich, sobald die Nachricht "basicAcked" ist, wird es nicht erneut an jeden Verbraucher geliefert). Sind Sie sicher, dass der andere Verbraucher tatsächlich konsumiert? – user1527491

+0

Richtig - Ich habe kurz vor dem Acking geschlafen. Ich CTRL + C während des Schlafes. Ich drucke die Nachricht im callDelivery() Callback des Consumers, aber es kommt nie durch. – Phillip

+0

Wenn Sie beide Verbraucher verbrauchen, empfangen sie Nachrichten gleichmäßig oder ist es immer das gleiche, das die Nachrichten empfängt? Wenn es immer derselbe Verbraucher ist, könnte dies ein Zeichen dafür sein, dass der zweite Verbraucher nicht richtig konfiguriert ist (z. B. nicht korrekt an die Warteschlange gebunden). Um noch sicherer zu sein, legen Sie einige Nachrichten in die Warteschlange und stellen Sie sicher, dass beide gleichzeitig konsumieren. Verwenden Sie außerdem das Bild "rabbitmq: 3-management" docker (+ weiter 15672 und öffnen Sie Ihren Browser, der Benutzername ist 'guest' und das Passwort ist' guest'), um herauszufinden, was mit der Nachricht in der Warteschlange tatsächlich passiert. – user1527491

Antwort

0

Es gibt keine Notwendigkeit, Schlaf oder etwas ähnliches in den Verbrauchercode zu setzen. Suchen Sie auf dem von Ihnen angegebenen Link nach einem Absatz, der mit Manuelle Nachrichtenbestätigungen beginnt, und sehen Sie sich dort den Code an. Der Schlüssel ist, die Nachricht nicht zu bestätigen. Wenn Sie das autoACK-Flag auf "true" gesetzt haben, können Sie alles aufrufen, was Sie möchten. Die Nachricht wird bestätigt, sobald sie empfangen wird. Setzen Sie also dieses Flag einfach nicht, und auch zum Testen können Sie die Zeile channel.basicAck(envelope.getDeliveryTag(), false); auskommentieren, um auch kein manuelles ACK zu machen. Wenn der Consumer beendet wird, befindet sich die Nachricht weiterhin in der Warteschlange.

+0

Hmm, scheint immer noch nicht zu funktionieren. Lassen Sie es mich wissen, wenn Sie den Code sehen möchten. – Phillip

+0

@Phillip sicher, fügen Sie Ihren Code zu der Frage bitte – cantSleepNow

Verwandte Themen