2012-10-30 12 views
5

Ich habe einen Anwendungsfall zum Veröffentlichen und Abonnieren, bei dem ich auf der Veröffentlichungsseite blockieren möchte, bis jeder Abonnent bestätigt, dass er die Bearbeitung der vom Herausgeber gesendeten Nachricht abgeschlossen hat.Warum blockiert Channel.waitForConfirmsOrDie nicht?

Ich (falsch?) Angenommen, dass ich RabbitMQ und seine Java amqp-Client Channel.waitForConfirmsOrDie-Methode als Teil meiner Lösung verwenden konnte. Das Problem ist, dass ich keinen Fall gefunden habe, in dem waitForConfirmsOrDie tatsächlich blockieren würde.

Nach dem javadocs wird waitForConfirmsOrDie soll:

Warten Sie, bis alle Nachrichten seit dem letzten Aufruf veröffentlicht wurden entweder durch den Makler ack'd oder nack'd. Wenn eine der Nachrichten fehlgeschlagen ist, löst waitForConfirmsOrDie eine IOException aus. Wenn er auf einem Nicht-Bestätigungs-Kanal aufgerufen wird, wird er sofort zurückkehren.

Um zu testen, dass diese Methode wirklich funktioniert, habe ich mit this example code from the RabbitMQ website gestartet.

Der Beispielcode erstellt einen Publisher und einen Consumer, jeweils mit einem eigenen Thread. Dann sendet der Herausgeber Nachrichten an die Vermittlungsstelle, während der Verbraucher die Nachrichten konsumiert. Es scheint, dass der Herausgeber blockieren soll, bis alle Nachrichten über seinen Aufruf von waitForConfirmsOrDie() bestätigt werden.

Dieser Beispielcode schien perfekt mit dem übereinzustimmen, was ich versuchte. Aber es scheint nicht so zu funktionieren, wie ich es dachte. In der Tat, wenn ich im Consumer-Thread automatische Nachrichten abstellen, dann wird waitForConfirmsOrDie() immer noch sofort zurück.

drehte ich auto ack off von nur einer falsch wahr zu ändern: ch.queueDeclare(QUEUE_NAME, false, false, false, null); ch.queueDeclare(QUEUE_NAME, true, false, false, null); (2. arg falsch statt true) wird. Ich glaube, das bedeutet, dass acks nicht mehr vom Verbraucher gesendet werden sollten.

Was macht waitForConfirmsOrDie() eigentlich? Wann würde es blockieren?

Wenn waitForConfirmsOrDie nicht das tut, was ich möchte, gibt es eine Möglichkeit, einen Publisher warten zu lassen, bis alle Abonnenten eine Nachricht bestätigen, bevor sie fortfahren?

Antwort

7

Soweit ich verstehe, sollen diese Anrufe nicht auf Bestätigung vom Verbraucher warten. Der Zweck der Methode besteht darin, sicherzustellen, dass Ihre Nachricht an den Broker übermittelt wurde und die Art der Benachrichtigung, die standardmäßig übermittelt/fehlgeschlagen ist, bereitgestellt wird. Mit anderen Worten, die Nachricht wird nicht verschwinden, ohne die Produktion zu melden, falls einer der rmq-Knoten (oder sogar alle Knoten) fehlgeschlagen/nicht verfügbar ist.

Sie können diese Ausnahme in Aktion sehen, wenn Sie rmq vor dem Aufruf basicPublish trennen oder ausschalten.

Verwandte Themen