2016-02-16 17 views
6

Ich versuche, einen Consumer für eine vorhandene Warteschlange zu schreiben.Abrufen einer Warteschlange ohne Angabe aller Eigenschaften

RabbbitMQ wird in einer separaten Instanz ausgeführt und die Warteschlange mit dem Namen "org-queue" ist bereits erstellt und an einen Exchange gebunden. org-queue ist eine dauerhafte Warteschlange und hat auch einige zusätzliche Eigenschaften.

Jetzt muss ich Nachrichten von dieser Warteschlange erhalten. Es wirft mir einen Fehler, der besagt andere dauerhafte Eigenschaft Ich habe den Code unten verwenden Instanz der Warteschlange

conn = Bunny.new 
conn.start 
ch = conn.create_channel  
q = ch.queue("org-queue") 

zu bekommen. Es scheint standardmäßig der Bunny verwendet durable = false. Also habe ich langlebig wahr als Parameter hinzugefügt. Jetzt gibt es den Unterschied zwischen anderen Parametern an. Muss ich alle Parameter angeben, um eine Verbindung herzustellen? Da rabbitMQ von verschiedenen Umgebungen verwaltet wird, ist es schwer für mich, alle Eigenschaften zu erhalten.

Gibt es eine Möglichkeit, eine Liste von Warteschlangen abzurufen und die erforderliche Warteschlange im Client abzurufen, anstatt eine Verbindung zu einer Warteschlange mit allen Parametern herzustellen.

+0

Normalerweise, wenn Sie mit einem Nachrichtenbus verbinden, sollten Sie den Vertrag kennen, den Sie einhalten müssen - dynamisch zu tun, wie Sie vorschlagen, kann verschiedene Probleme verursachen und kann SEHR schwierig sein zu debuggen. Ich würde es nicht empfehlen – Anthony

+0

Ich zweite das. Sie sollten über die Parameter verfügen, die zum Einrichten der Warteschlangen irgendwo in einer Umgebungsvariablen verwendet werden, und eine Verbindung mit der Warteschlange/dem Austausch herstellen, die diese verwenden. – LukeS

Antwort

1

Haben Sie den Parameter: passiv = true in der Warteschlange() versucht? Ein echtes Beispiel ist die rabbitmq plugin of logstash. : passiv bedeutet, nur die Existenz der Warteschlange zu überprüfen, anstatt sie beim Verbrauch von Nachrichten zu deklarieren.

0

Vielleicht gibt es einen Weg, um es mit rabbitmqctl oder dem Admin-Tool (ich habe den Namen vergessen), so dass die Informationen über die Warteschlange. Selbst wenn, würde ich nicht stören.

Es gibt zwei mögliche Lösungen, die mir in den Sinn kommen.

Erste Lösung:

In der Regel, wenn Sie eine bereits bestehende Warteschlange erklären wollen, muss es mit allen korrekten Parametern sein. Also, was ich tue, ist mit einer Hilfsfunktion zum Deklarieren einer bestimmten Warteschlange (ich benutze C++ Client, so dass die API kann anders sein, aber ich bin mir sicher, Konzept ist das gleiche). Zum Beispiel, wenn ich 10 Abonnenten habe, die queue1 konsumieren, und jeder von ihnen muss die Queue auf dieselbe Weise deklarieren, schreibe ich einfach ein util, das diese Queue deklariert und das ist es.


Vor der zweiten Lösung ein wenig etwas: Vielleicht ist hier der Fall, in dem wir zu einem Missverständnis gekommen, dass zu oft geschieht :) Es ist nicht wirklich eine bestimmte Warteschlange müssen von der Nachrichten zu erhalten diese Warteschlange. Was Sie brauchen, ist eine Warteschlange und die richtige Bindung. Wenn Sie eine Nachricht senden, senden Sie nicht wirklich an die Warteschlange, sondern an den Austausch, manchmal mit Routing-Schlüssel, manchmal ohne einen - sagen wir mal mit. Auf der Empfängerseite benötigen Sie eine Warteschlange, um eine Nachricht zu konsumieren, also deklarieren Sie natürlich eine und binden sie an eine Vermittlungsstelle mit einem Routing-Schlüssel. Sie brauchen den Namen der Warteschlange nicht einmal explizit zu benötigen, der Server stellt Ihnen einen generischen Namen zur Verfügung, damit Sie ihn beim Binden verwenden können.


Zweite Lösung: beruht auf der Tatsache, dass

Es völlig legal mehrere Warteschlangen mit der gleichen Bindung Schlüssel (gefunden hier https://www.rabbitmq.com/tutorials/tutorial-four-java.html)

zu binden So kann jeder Ihrer Abonnenten eine Warteschlange auf jede gewünschte Art und Weise delektieren, solange sie das bindende corr machen ectly. Natürlich wären dies verschiedene Warteschlangen mit unterschiedlichen Namen. I würde dies nicht empfehlen. Dies impliziert, dass jede Nachricht zum Beispiel zu zwei Warteschlangen geht und höchstwahrscheinlich eine Nachricht (ich nehme an, dass der Anwendungsfall hier nur einmal von einem Teilnehmer verarbeitet werden muss).

1

auf der Dokumentation Basierend hier http://reference.rubybunny.info/Bunny/Queue.html und http://reference.rubybunny.info/Bunny/Channel.html

die ch.queues() Methode Verwenden Sie einen Hash aller Warteschlangen auf diesem Kanal zu bekommen. Wenn Sie dann die Instanz der Warteschlange gefunden haben, mit der Sie sich verbinden möchten, können Sie mit der Methode q.options() herausfinden, welche Optionen sich in dieser rabbitmq-Warteschlange befinden.

Scheint wie eine Runde um es zu tun, aber könnte funktionieren. Ich habe das nicht getestet, da ich im Moment keinen rabbitmq-Server habe.

+0

Für mich gibt ch.queues() einen leeren Hash zurück, obwohl Warteschlangen in meinem rabbitMQ Server vorhanden sind – sag