2016-02-16 23 views
6

Sto tentando di scrivere un utente per una coda esistente.Ottenere una coda senza fornire tutte le sue proprietà

RabbbitMQ è in esecuzione in un'istanza separata e la coda denominata "org-queue" è già stata creata e associata a uno scambio. org-queue è una coda duratura e ha anche alcune proprietà aggiuntive.

Ora ho bisogno di ricevere messaggi da questa coda. Ho utilizzare il codice sottostante per ottenere un'istanza della coda

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

Mi lancia un errore che indica diverse proprietà durevole. Sembra che per impostazione predefinita Bunny usi durable = false. Quindi ho aggiunto true true come parametro. Ora indica la differenza tra altri parametri. Devo specificare tutti i parametri, per connettersi ad esso? Poiché rabbitMQ viene gestito da un ambiente diverso, è difficile per me ottenere tutte le proprietà.

C'è un modo per ottenere l'elenco delle code e ascoltare la coda richiesta nel client invece di collegarsi a una coda con tutti i parametri.

+0

In genere quando si interfaccia con un bus di messaggi si deve conoscere il contratto che è necessario rispettare, farlo dinamicamente come si suggerisce può creare vari problemi e può essere MOLTO difficile da eseguire il debug. Non lo raccomanderei allo – Anthony

+0

Secondo. Dovresti avere i parametri usati per impostare le code da qualche parte in una variabile d'ambiente e collegarti alla coda/scambio usando quelli. – LukeS

risposta

1

Hai provato il: passive = true parameter on queue()? Un esempio reale è lo rabbitmq plugin of logstash. : passivo significa solo controllare l'esistenza della coda piuttosto che dichiararla quando si consumano messaggi da essa.

0

Forse c'è un modo per ottenerlo con rabbitmqctl o lo strumento di amministrazione (ho dimenticato il nome), quindi le informazioni sulla coda. Anche se così, non mi preoccuperei.

Ci sono due soluzioni possibili che mi vengono in mente.

Prima soluzione:

In generale, se volete dichiarare una coda già esistente, deve essere con tutti i parametri corretti. Quindi quello che sto facendo è avere una funzione di supporto per dichiarare una coda specifica (sto usando il client C++, quindi l'API potrebbe essere diversa ma sono sicuro che il concetto è lo stesso). Per esempio, se ho 10 abbonati che stanno consumando la coda1, e ognuno di loro ha bisogno di dichiarare la coda nello stesso modo, scriverò semplicemente un util che dichiara questa coda e basta.


Prima che la seconda soluzione un po 'di qualcosa: Forse qui è il caso in cui arriviamo a un equivoco che accade troppo spesso :) Non avete davvero bisogno di una coda specifica per ottenere i messaggi da quella coda. Quello di cui hai bisogno è la a code e la corretta associazione. Quando si invia un messaggio, non si sta realmente inviando alla coda, ma allo scambio, a volte con la chiave di routing, a volte senza una - diciamo con. Sul lato ricevente è necessaria una coda per consumare un messaggio, quindi naturalmente lo si dichiara e lo si lega a uno scambio con una chiave di instradamento. Non è necessario nemmeno il nome della coda esplicitamente, il server fornirà un generico per te, in modo che tu possa usarlo durante il binding.


Seconda soluzione: si basa sul fatto che

E 'perfettamente legale per vincolare più code con lo stesso legame chiave (trovato qui https://www.rabbitmq.com/tutorials/tutorial-four-java.html)

Così ognuno dei tuoi abbonati può delcare una coda nel modo che preferisce, a patto che faccia il correttivo vincolante ectly. Naturalmente queste sarebbero code diverse con nomi diversi. I non lo raccomanderei questo. Ciò implica che ogni messaggio passi a due code ad esempio e molto probabilmente a un messaggio (presumo che il caso d'uso qui debba essere elaborato solo una volta da un sottoscrittore).

1

sulla base della documentazione qui http://reference.rubybunny.info/Bunny/Queue.html e http://reference.rubybunny.info/Bunny/Channel.html

Utilizzando il metodo ch.queues() si potrebbe ottenere un hash di tutte le code su quel canale. Quindi, una volta individuata l'istanza della coda che si desidera connettere, è possibile utilizzare il metodo q.options() per individuare le opzioni disponibili in tale coda di conigliomq.

Sembra un modo per farlo ma potrebbe funzionare. Non ho provato questo perché non ho un server di rabbitmq al momento.

+0

Per me ch.queues() restituisce un hash vuoto anche se le code sono presenti nel mio server rabbitMQ – sag