2015-04-10 7 views
6

Ich habe ein Szenario, in dem ich einige Nachrichten an Rabbitmq-Exchange mit einem bestimmten Routing-Schlüssel für zB veröffentlichen möchten. abcRabbitMq: Create Warteschlange dynamisch

Das Problem ist, dass möglicherweise bereits eine Warteschlange mit Routing-Schlüssel "abc" bereits gebunden ist oder nicht sein kann. Das Verhalten für solche Szenarien scheint entweder diese Nachricht zu löschen oder wenn ein Dead Letter Exchange konfiguriert ist, wird es an den Dead Letter Exchange weitergeleitet.

Ich möchte dynamisch eine Warteschlange mit dem gleichen Namen wie der Routing-Schlüssel erstellen, d. H. "Abc", wenn keine Warteschlange für diesen Routing-Schlüssel vorhanden ist, anstatt sie an DLX abzusetzen oder zu senden.

Gibt es einen bekannten Weg, das Gleiche zu tun?

+0

In JMS würde ich nicht wissen - wenn es .NET wäre, würde ich vorschlagen, das HareDU-Paket als Ausgangspunkt zu verwenden, um zu überprüfen, ob die Warteschlange bereits vorhanden ist. https://github.com/ahives/HareDu – Paul

+0

Ich möchte nicht einen expliziten API-Treffer machen, um zu überprüfen, ob die Warteschlange existiert oder nicht, aber ich möchte überprüfen, ob es eine Möglichkeit gibt, das Standardverhalten von Exchange zu ändern, um ein zu erstellen Warteschlange, wenn nicht bereits vorhanden. – Rahul

+0

@rahulroc, http://stackoverflow.com/questions/21265242/dynamic-queue-creation-with-rabbitmq das könnte Ihnen helfen –

Antwort

1

Aus meinen Untersuchungen ist mir keine Möglichkeit bekannt, die Serverseite so zu konfigurieren, dass Warteschlangen dynamisch erstellt werden. Sie können dies jedoch auf der Clientseite tun, um den gleichen Effekt zu erzielen:

Implementieren Sie eine ReturnListener auf dem Kanal für nicht routable Nachrichten zu überwachen. Schauen Sie sich den Abschnitt „Umgang mit unroutable Nachrichten“ auf dieser Seite finden Sie ein Beispiel:

https://www.rabbitmq.com/api-guide.html

Dann können Sie die routingKey verwenden, die in den Handler übergeben wird eine Warteschlange mit dem gleichen Namen zu erstellen, mit der queueDeclare() und queueBind() Methoden (siehe "Austausch und Warteschlangen verwenden" auf demselben Link als Beispiel).

+0

Das ist wieder eine clientseitige Konfiguration, die mir bereits bekannt war. Was ich suche, ist einige Exchange/Broker-Seite Konfiguration – Rahul

1

Es gibt kein afaik defaut-Verhalten für Ihren Fall. Sie könnten ein Plugin erstellen oder Sie könnten sich auf die Client-Logik verlassen, die der Zweck meiner Antwort ist.

Es ist wichtig, dass RabbitMQ Warteschlange declare/bind zu wissen, ist eine idempotent operation

Declare Warteschlange erstellen, wenn needed.This Methode erstellt oder prüft eine Warteschlange. Beim Erstellen einer neuen Warteschlange kann der Client verschiedene Eigenschaften angeben, die die Dauerhaftigkeit der Warteschlange und ihres Inhalts sowie die Freigabeebene für die Warteschlange steuern.

Hypothese 1: Warteschlangen nicht gelöscht oder Warteschlangen gelöscht werden können werden können, aber Clients wird es wissen, kann der Warteschlangensatz

Jeder Client verwaltet einen Satz von Warteschlangen in den Speicher passen. Vor dem Senden einer Nachricht überprüft der Client, ob der Satz die Warteschlange enthält. Wenn dies nicht der Fall ist, wird die Warteschlange deklariert und gebunden und die Warteschlange in die Gruppe eingefügt.

Bei Bootstrap kann die Warteschlangen-Set mit den vorhandenen Warteschlangen zum Beispiel unter Verwendung initialisiert wird die HTTP API (z. B. ein java client)

Wie es auf Ihrem RabbitMQ Client zu tun, hängt davon ab. Zum Beispiel mit spring-amqp, können Sie erweitern und RabbitTemplate#doSend

Hypothese überschreiben 2: Warteschlangen gelöscht werden können und Kunden wissen nicht

Wie GeekChick vorgeschlagen, dass Sie ein ReturnListener registrieren.Alle Nachricht muss mit der mandatory flag

Hypothese 3 gesendet werden: Ich kümmere mich nicht um die Kosten von declare/bind Warteschlange *

Sie immer, bevor Sie eine Nachricht zu senden, erklären und die Warteschlange binden. AFAIK die einmal erstellten Kosten sollten mehr oder weniger dem Netzwerk-Footprint + Karten-Lookup entsprechen.

+0

Alle Methoden, die Sie darauf hingewiesen, beinhalten die Client-Seite Logik, die einen zusätzlichen Overhead erstellen. Ich weiß, dass die Erstellung von Warteschlangen eine idempotente Operation ist, bei der einige Eigenschaften bei der Erstellung von Warteschlangen angegeben werden müssen. Ich versuche jedoch, eine Konfiguration zu finden, die einige Standardeigenschaften angeben kann, und Warteschlangen werden automatisch erstellt. – Rahul

Verwandte Themen