RabbitMQ Warten, bis eine Meldung mit einem timeout
Ich würde gerne eine Nachricht senden, die eine RabbitMQ-server und warten dann auf eine Antwort-Nachricht (auf eine "reply-to" - Warteschlange). Natürlich, ich will nicht ewig warten, falls die Anwendung die Verarbeitung dieser Nachrichten ist down - muss es ein timeout. Es klingt wie eine sehr einfache Aufgabe sein, doch ich kann nicht einen Weg finden, dies zu tun. Ich habe jetzt dieses problem mit Java-API.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den RabbitMQ-Java-client-Bibliothek jetzt unterstützt eine timeout-argument, um Ihre
QueueConsumer.nextDelivery()
Methode.Beispielsweise die RPC tutorial verwendet den folgenden code:
Nun können Sie
consumer.nextDelivery(1000)
zu warten, für maximal eine Sekunde. Wenn das timeout erreicht ist, gibt die Methodenull
.com.rabbitmq.client.QueueingConsumer
hat einenextDelivery(long timeout)
Methode, die tun, was Sie wollen. Dies wurde jedoch abgelehnt.Schreiben Sie Ihre eigene timeout ist nicht so schwer, obwohl es vielleicht besser sein, um einen Laufenden thread und eine Liste von in-time IDS, anstatt das hinzufügen und entfernen von Verbrauchern und damit verbundenen timeout-threads die ganze Zeit.
Bearbeiten, um hinzuzufügen: Bemerkt, das Datum, an diese nach der Beantwortung!
Näherte ich mich diesem problem mit Hilfe von C# durch das erstellen eines Objekts zu verfolgen, die Reaktion auf eine bestimmte Nachricht. Setzt es eine eindeutige Antwort-queue eine Nachricht, und abonniert Sie. Wenn die Antwort nicht empfangen wird, in einem festgelegten Zeitrahmen, einen countdown-timer, kündigt das Abonnement, das löscht die Warteschlange. Unabhängig davon habe ich Methoden, die synchron von meinem Haupt-thread (verwendet eine semaphore) oder asynchron (mit einem callback zu nutzen diese Funktionalität.
Grundsätzlich, die Umsetzung sieht wie folgt aus:
Gibt es ähnliche Frage. Obwohl es die Antworten von java nicht verwendet, vielleicht können Sie einige Hinweise.
Warten auf eine Einzel-RabbitMQ-Meldung mit einem timeout