2013-03-11 23 views
6

Jestem w stanie utworzyć wymianę fanoutów za pomocą tutoriala Java RabbitMQ Publish/Subscribe, a każdy podłączony konsument otrzyma kopię wiadomości. Zamiast deklarować wymianę i wiązanie dynamicznie/programowo, chciałbym stworzyć wymianę i wiązanie przed podłączeniem jakichkolwiek klientów. Zrobiłem to poprzez konsolę RabbitMQ Management Console. Z jakiegoś powodu moi konsumenci otrzymują wiadomości w sposób okrągły, a nie wszystkie odbierają kopie wiadomości. czego mi brakuje? Oto niektóre fragmenty kodu:Problemy z wymianą wentylatorów RabbitMQ

Wydawca:

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

konsumentów:

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

... A w konsoli Zarządzanie RabbitMQ, stworzyłem wymianę "publiczne" typu "fanout" , i ustawiłem powiązanie z tej wymiany na "myqueue".

Doceniam każdą pomoc!

Odpowiedz

17

Wygląda na to, że wszyscy Twoi konsumenci subskrybują tę samą kolejkę. Gdy wielu klientów subskrybuje tę samą kolejkę, domyślnym zachowaniem RabbitMQ jest zaokrąglanie wiadomości między wszystkimi subskrybowanymi konsumentami. Zobacz "Wysyłanie robaków" w numerze RabbitMQ Tutorial #2: Work Queues.

Wymiana wentylatora zapewnia, że ​​każda kolejka powiązana z nim otrzymuje kopię wiadomości, a nie każdego konsumenta. Jeśli chcesz, aby każdy konsument otrzymał kopię wiadomości, zazwyczaj każdy z klientów utworzyłby własną kolejkę, a następnie powiąże się z giełdą. Nie jestem pewien, dlaczego próbujesz uniknąć programowego tworzenia/wiązania kolejki, ale jeśli wiesz z wyprzedzeniem liczbę subskrybentów i utworzyć kolejkę dla każdego z nich, możesz uzyskać ten sam efekt.

+1

Ta odpowiedź była dla mnie bardzo pomocna, dziękuję! Ciągle myślałem, że każdy związany konsument otrzyma kopię wiadomości, a nie każdą powiązaną kolejkę. To naprawiło mój problem. Dzięki jeszcze raz! – littleK