2016-02-16 22 views
6

Próbuję zapisać konsumenta dla istniejącej kolejki.Uzyskiwanie kolejki bez podania wszystkich jej właściwości

Program RabbbitMQ działa w oddzielnej instancji, a kolejka o nazwie "org-queue" jest już utworzona i powiązana z centralą. Kolejka org to trwała kolejka, która ma również dodatkowe właściwości.

Teraz potrzebuję otrzymywać wiadomości z tej kolejki. mam użyć poniższy kod, aby uzyskać instancję kolejki

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

To wyrzuca mi błąd informujący inną nieruchomość trwały. Domyślnie Bunny używa durable = false. Dodałem więc durable true as parameter. Teraz określa różnicę między innymi parametrami. Czy muszę podać wszystkie parametry, aby się z nim połączyć? Ponieważ rabbitMQ jest utrzymywany przez różne środowiska, trudno jest uzyskać wszystkie właściwości.

Czy istnieje sposób na uzyskanie listy kolejek i odsłuchiwanie wymaganej kolejki w kliencie zamiast łączenia się z kolejką za pomocą wszystkich parametrów.

+0

Zwykle podczas łączenia z magistralą komunikatów powinieneś znać umowę, którą musisz podtrzymać - robienie tego dynamicznie, jak sugerujesz, może powodować różne problemy i może być BARDZO trudne do debugowania. Nie polecałbym tego. – Anthony

+0

Po drugie. Powinieneś mieć parametry używane do ustawiania kolejek gdzieś w zmiennej środowiskowej i łączenia się z kolejką/wymianą za ich pomocą. – LukeS

Odpowiedz

1

Czy próbowałeś: passive = true parametru w kolejce()? Prawdziwym przykładem jest rabbitmq plugin of logstash. : bierny oznacza tylko sprawdzanie istnienia kolejki, a nie deklarowanie jej podczas pobierania z niej wiadomości.

0

Być może istnieje sposób, aby go zdobyć za pomocą narzędzia rabbitmqctl lub narzędzia administratora (zapomniałem nazwy), a więc informacji o kolejce. Nawet jeśli tak, nie zawracałbym sobie głowy.

Są dwa możliwe rozwiązania, które przychodzą mi na myśl.

Pierwsze rozwiązanie:

W ogóle, jeśli chcesz zadeklarować już istniejącą kolejkę, to musi być z poprawne parametry. Więc co robię jest o funkcji pomocnika do deklarowania określonej kolejki (używam klienta C++, więc interfejs API może być inny, ale jestem pewien, że koncepcja jest taka sama). Na przykład, jeśli mam 10 subskrybentów, którzy zużywają kolejkę1, a każdy z nich musi zadeklarować kolejkę w ten sam sposób, po prostu napiszę narzędzie, które deklaruje tę kolejkę i to jest to.


Przed drugim roztworze trochę coś: Może tutaj jest przypadek, w którym możemy dojść do błędnego przekonania, że ​​dzieje się zbyt często :) Tak naprawdę nie potrzebują konkretnej kolejki, aby uzyskać wiadomości z ta kolejka. Potrzebna jest kolejka i poprawne powiązanie . Wysyłając wiadomość, tak naprawdę nie wysyłasz do kolejki, ale do centrali, czasem z kluczem routingu, czasami bez jednego - powiedzmy z. Na końcu odbierającym potrzebujesz kolejki, aby odebrać wiadomość, więc oczywiście zadeklaruj jedną i połącz ją z kluczem routingu. Nie trzeba nawet jawnie wymieniać nazwy kolejki, serwer zapewni dla ciebie rodzajowy, aby można go było użyć podczas wiązania.


drugie rozwiązanie: opiera się na fakcie, że

Jest to całkowicie legalne związać wielu kolejek z tym samym wiążące kluczową (znaleziono tu https://www.rabbitmq.com/tutorials/tutorial-four-java.html)

Tak więc każdy z Twoich subskrybentów może odświeżyć kolejkę w dowolny sposób, o ile wykonają wiążący corr ectly. Oczywiście byłyby to różne kolejki o różnych nazwach. I nie poleciłbym tego tego. Oznacza to, że każda wiadomość trafia na przykład do dwóch kolejek i najprawdopodobniej do komunikatu (zakładam, że przypadek użycia musi zostać przetworzony tylko raz przez jednego subskrybenta).

1

Na podstawie dokumentacji tutaj http://reference.rubybunny.info/Bunny/Queue.html i http://reference.rubybunny.info/Bunny/Channel.html

Stosując metodę ch.queues() można dostać hash wszystkich kolejek na tym kanale. Gdy znajdziesz instancję kolejki, z którą chcesz się połączyć, możesz użyć metody q.options(), aby dowiedzieć się, jakie opcje znajdują się w tej kolejce rabbitmq.

Wygląda jak runda, aby to zrobić, ale może działać. Nie testowałem tego, ponieważ nie mam w tej chwili serwera rabbitmq.

+0

Dla mnie ch.queues() zwraca pusty hasz, chociaż kolejki są obecne w moim serwerze rabbitMQ – sag

Powiązane problemy