2013-03-11 15 views
6

Ich bin in der Lage, einen Fanout-Austausch mit der Publish/Subscribe RabbitMQ Java-Tutorial erstellen, und jeder angeschlossene Verbraucher wird eine Kopie einer Nachricht erhalten. Anstatt einen Austausch zu deklarieren und dynamisch/programmatisch zu binden, möchte ich den Austausch und die Bindung erstellen, bevor ich irgendwelche Konsumenten verbinde. Ich habe dies über die RabbitMQ Management Console getan. Aus irgendeinem Grund empfangen meine Kunden jedoch Nachrichten in einer Round-Robin-Weise, anstatt alle Kopien der Nachricht zu empfangen. Was vermisse ich? Hier sind einige Code-Schnipsel:Probleme mit RabbitMQ Fanout Austausch

Verlag:

channel.basicPublish("public", "", null, rowId.getBytes("UTF-8")); 

Verbraucher:

QueueingConsumer consumer = new QueueingConsumer(channel); 
      channel.basicConsume("myqueue", false, consumer); 

... Und in der RabbitMQ Management-Konsole, habe ich einen Austausch "public" vom Typ "Fanout" und ich habe eine Bindung von diesem Austausch an "meine Warteschlange" gesetzt.

würde ich jede Hilfe dankbar!

Antwort

17

Es klingt, als ob alle Ihre Kunden die gleiche Warteschlange abonnieren. Wenn mehrere Benutzer dieselbe Warteschlange abonnieren, besteht das Standardverhalten von RabbitMQ darin, die Nachrichten zwischen allen abonnierten Consumern roundrobin zu senden. Siehe "Round-Robin-Dispatching" in der RabbitMQ Tutorial #2: Work Queues.

Der Fanout-Austausch dient dazu, sicherzustellen, dass jede an ihn gebundene Warteschlange eine Kopie der Nachricht erhält, nicht jeder Verbraucher. Wenn Sie möchten, dass jeder Verbraucher eine Kopie der Nachricht erhält, müssten Sie in der Regel für jeden Verbraucher eine eigene Warteschlange erstellen und sich dann an die Vermittlungsstelle binden. Ich bin mir nicht sicher, warum Sie versuchen, das programmatische Erstellen/Binden einer Warteschlange zu vermeiden, aber wenn Sie die Anzahl der Abonnenten im Voraus kennen und für jede eine Warteschlange erstellen, können Sie den gleichen Effekt erzielen.

+1

Diese Antwort war sehr hilfreich für mich, danke! Ich habe immer daran gedacht, dass jeder gebundene Verbraucher eine Kopie der Nachricht erhält und nicht jede gebundene Warteschlange. Das hat mein Problem behoben. Danke noch einmal! – littleK