2013-03-11 12 views
6

Sono in grado di creare uno scambio fanout utilizzando il tutorial Publish/Subscribe RabbitMQ Java e qualsiasi utente connesso riceverà una copia di un messaggio. Invece di dichiarare uno scambio e legare dinamicamente/programmaticamente, vorrei creare lo scambio e l'associazione prima di collegare qualsiasi consumatore. Ho fatto questo attraverso la console di gestione RabbitMQ. Per qualche motivo, tuttavia, i miei utenti ricevono messaggi in modalità round robin, piuttosto che ricevere tutte le copie del messaggio. Cosa mi manca? Ecco alcuni frammenti di codice:Problemi con lo scambio fanout RabbitMQ

Editore:

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

dei consumatori:

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

... E nella console Gestione RabbitMQ, ho creato uno scambio "pubblico" di tipo "fan-out" e ho impostato un'associazione da quella borsa su "myqueue".

Apprezzerei qualsiasi aiuto!

risposta

17

Sembra che tutti i vostri clienti si siano abbonati alla stessa coda. Quando più utenti sottoscrivono la stessa coda, il comportamento predefinito di RabbitMQ è quello di arrotondare i messaggi tra tutti i consumatori sottoscritti. Vedi "Spedizione round robin" nel RabbitMQ Tutorial #2: Work Queues.

Lo scambio fanout serve a garantire che ogni coda ad essa associata ottenga una copia del messaggio, non ogni consumatore. Se si desidera che ogni consumatore ottenga una copia del messaggio, in genere ogni consumatore dovrà creare la propria coda e quindi legarsi allo scambio. Non sono sicuro del motivo per cui stai cercando di evitare la creazione/associazione di una coda a livello di codice, ma se conosci in anticipo il numero di abbonati e crei una coda per ognuno, puoi ottenere lo stesso effetto.

+1

Questa risposta è stata molto utile per me, grazie! Continuavo a pensare che ogni consumatore legato riceverà una copia del messaggio, piuttosto che ogni coda legata. Questo ha risolto il mio problema. Grazie ancora! – littleK