Ho implementato esattamente ciò che descrivi. Ecco alcuni suggerimenti basati sulla mia esperienza e relativi a ciascuna delle tue domande.
Q1 (come riprovare X volte):
Per questo, è possibile utilizzare IMessage.Body.BasicProperties.Headers
. Quando si consuma un messaggio da una coda di errori, basta aggiungere un'intestazione con un nome scelto. Cerca questa intestazione su ogni messaggio che entra nella coda degli errori e incrementalo. Questo ti darà un conteggio dei tentativi in corso.
È molto importante che si dispone di una strategia per cosa fare quando un messaggio supera il limite di tentativi di X. Non si vuole perdere quel messaggio. Nel mio caso, scrivo il messaggio su disco a quel punto. Ti offre molte utili informazioni di debug per tornare più tardi, perché EasyNetQ esegue automaticamente il wrapping del messaggio di origine con le informazioni di errore. Ha anche il messaggio originale, in modo che tu possa, se vuoi, manualmente (o magari automatizzato, tramite un codice di rielaborazione batch), ri-accodare il messaggio in un secondo momento in modo controllato.
Puoi vedere il codice nell'utilità Hosepipe per vedere un buon modo per farlo. In effetti, se segui lo schema che vedi lì, puoi anche utilizzare Hosepipe in seguito per riaccodare i messaggi se necessario.
Q2 (come creare una coda di errore per coda originario):
È possibile utilizzare l'EasyNetQ avanzata Bus per fare questo in modo pulito. Utilizzare IBus.Advanced.Container.Resolve<IConventions>
per accedere all'interfaccia delle convenzioni. Quindi è possibile impostare le convenzioni per la denominazione della coda di errore con conventions.ErrorExchangeNamingConvention
e conventions.ErrorQueueNamingConvention
. Nel mio caso, ho impostato la convenzione in base al nome della coda di origine in modo da ottenere una coppia di code/queue_error di code ogni volta che creo una coda.
Q3 (come elaborare i messaggi nelle code di errore):
È possibile dichiarare un consumatore per l'errore coda allo stesso modo di fare qualsiasi altra coda. Anche in questo caso, AdvancedBus ti consente di farlo in modo pulito specificando che il tipo che si stacca dalla coda è EasyNetQ.SystemMessage.Error
. Quindi, IAdvancedBus.Consume<EasyNetQ.SystemMessage.Error>()
ti porterà lì. Riprendere significa semplicemente ripubblicare allo scambio originale (prestando attenzione al numero di tentativi che hai inserito nell'intestazione (vedi la mia risposta al Q1, sopra), e le informazioni nel messaggio di errore che hai consumato dalla coda degli errori possono aiutarti a trovare l'obiettivo per
Abbiamo trovato che non c'era davvero alcun uso pratico per l'implementazione standard di EasyNetQ al di fuori di una singola dimostrazione rapida, legata ad alcune classi .NET condivise, per gli utenti principianti. "API Sì, puoi fare cose avanzate, ma onestamente è un'API meravigliosamente semplice da usare, sicuramente un fan dell'API di Easy's Advanced per qualsiasi tipo di lavoro –