2015-04-10 18 views
6

Ho uno scenario in cui voglio pubblicare alcuni messaggi su rabbitmq-exchange utilizzando una chiave di routing specifica per es. abcRabbitMq: creare dinamicamente la coda

Il problema è che potrebbe esistere già una coda già associata alla chiave di routing "abc" o potrebbe non esserlo. Il comportamento di tali scenari sembra essere quello di abbandonare quel messaggio o se è configurato uno scambio di lettere morte, sarà indirizzato allo scambio di lettere morte.

Desidero creare dinamicamente una coda con lo stesso nome della chiave di routing, ad esempio "abc" se non è presente alcuna coda per quella chiave di routing invece di rilasciarla o inviarla a DLX.

Esiste un modo noto per fare lo stesso?

+0

In JMS non saprei - se fosse .NET, suggerirei di usare il pacchetto HareDU come punto di partenza per verificare se la coda è già presente. https://github.com/ahives/HareDu – Paul

+0

Non voglio fare un hit API esplicito per verificare se la coda esiste o no, ma voglio verificare se c'è un modo per modificare il comportamento predefinito dello scambio per creare un coda se non presente già. – Rahul

+0

@rahulroc, http://stackoverflow.com/questions/21265242/dynamic-queue-creation-with-rabbitmq questo potrebbe aiutarti –

risposta

1

Dalla mia ricerca, non sono a conoscenza di un modo per configurare il lato server per creare code in modo dinamico. Tuttavia, è possibile farlo dal lato client per ottenere lo stesso effetto:

Implementare un ReturnListener sul canale per ascoltare i messaggi non instradabili. Consultare la sezione "Gestione dei messaggi unroutable" in questa pagina per un esempio:

https://www.rabbitmq.com/api-guide.html

Quindi, è possibile utilizzare il routingKey che è passato nel gestore per creare una coda con lo stesso nome, utilizzando la queueDeclare() e Metodi queueBind() (vedere "Uso di scambi e code" sullo stesso collegamento per un esempio).

+0

Questa è di nuovo una configurazione lato client di cui ero già a conoscenza. Quello che cerco è una configurazione lato scambio/broker – Rahul

1

Non esiste un comportamento predefinito di afaik per il tuo caso. Potresti creare un plugin o affidarti alla logica del client che è lo scopo della mia risposta.

E 'importante sapere che coda di RabbitMQ dichiarare/bind è una coda di Declare idempotent operation

, creare se il metodo needed.This crea o controlla una coda. Durante la creazione di una nuova coda il client può specificare varie proprietà che controllano la durata della coda e il suo contenuto e il livello di condivisione per la coda.

ipotesi 1: le code non possono essere cancellati o code possono essere eliminati, ma i clienti lo sapranno, il set di coda può rientrare nella memoria

Ogni cliente mantiene un insieme di code. Prima di inviare un messaggio, il client controlla se il set contiene la coda. In caso contrario, dichiara e associa la coda e inserisce la coda nel set.

Al bootstrap, il set di code può essere inizializzato con le code esistenti usando per esempio il HTTP API (ad es. Un java client)

Come fare dipende dal vostro client RabbitMQ. Ad esempio, utilizzando spring-amqp, è possibile estendere e sovrascrivere RabbitTemplate#doSend

ipotesi 2: le code possono essere cancellati e clienti non si sa

Come suggerito da GeekChick è possibile registrare un ReturnListener.Tutto messaggio deve essere inviata con la mandatory flag

ipotesi 3: Non mi importa il costo di dichiarare coda/bind *

Hai sempre, prima di inviare un messaggio, dichiara e legare la coda. AFAIK il costo, una volta creato, dovrebbe essere più o meno uguale al footprint di rete + alla ricerca della mappa.

+0

Tutti i metodi che hai indicato riguardano la logica lato client che crea un overhead aggiuntivo. So che la creazione della coda è un'operazione idempotent in cui alcune proprietà devono essere specificate durante la creazione della coda, ma quello che sto cercando di capire è una configurazione che può specificare alcune proprietà predefinite e le code vengono create automaticamente. – Rahul