2011-12-11 16 views
6

Sto scrivendo su una coda RabbitMQ con spring amqp usando la classe RabbitTemplate. Io uso il metodo convertAndSend per inviare messaggi alla coda. Funziona bene in situazioni normali, ma sembra fallire silenziosamente se la coda non esiste. Non viene generata alcuna eccezione e nessun messaggio di errore/debug viene registrato nel registratore.Come faccio a sapere che il mio messaggio è stato inviato correttamente con spring amqp?

Qual è il modo migliore per assicurarmi che il messaggio sia stato recapitato?

Ecco un esempio di ciò che il codice sta facendo attualmente.

RabbitTemplate template = new RabbitTemplate(factory); 
template.setQueue(queueName); 
template.setRoutingKey(queueName); 
template.convertAndSend(message); 
+0

sei assolutamente sicuro che nessun messaggio è stato registrato? Hai provato un test unitario con il broker deliberatamente in calo? – artbristol

+0

Non ero a conoscenza dell'errore silenzioso se il broker non funziona, in effetti ricevo una UnknownHostException se il broker non funziona. Ho aggiornato la domanda. Detto questo, continuo a non ricevere alcuna eccezione o messaggio di errore se la coda non esiste. –

+0

potresti pubblicare lo snippet di codice in cui spedisci il messaggio? – artbristol

risposta

2

Non è un errore per un cliente RabbitMQ per inviare un messaggio a un broker che non ha le code legate al suo interno per accettare il messaggio. RabbitMQ lo abbandonerà silenziosamente e il client non ne sarà più saggio. Se non hai code interessate ai tuoi messaggi, il broker non ha molte altre opzioni disponibili.

Detto questo, è possibile fare in modo che RabbitMQ si lamenti se il messaggio si chiuderà silenziosamente impostando il flag mandatory. Non so se le interfacce Spring AMQP lo supportano, ma è certamente disponibile nella libreria client Java RabbitMQ.

+0

Grazie, lo esaminerò. Cercherò di arrivarci domani, siamo abbastanza occupati in questo momento. –

+0

Non vedo alcun modo per impostare un flag obbligatorio. Nessuno degli oggetti spring-amqp che sto usando sembra avere quell'impostazione. –

+0

Penso che il mio problema è che il messaggio è considerato consegnato perché arriva allo scambio. Il messaggio non viene mai instradato alla coda perché non esiste. Probabilmente c'è qualche configurazione in rabbit che deve essere configurata per assicurarsi che il messaggio non vada perso. –

1

È possibile utilizzare mandatory e abilitare anche restituzioni dei publisher (per i messaggi non recapitabili).