Questo articolo è un articolo speculare di traduzione automatica, clicca qui per saltare all'articolo originale.

Vista: 24043|Risposta: 0

[WinForm] Disconnessione e riconnessione RabbitMQ in .net/c#

[Copiato link]
Pubblicato su 29/03/2018 16:30:04 | | | |
Il codice di esempio ufficiale NET per consumatori fornito da Rabbitmq è il seguente, ma durante il processo di utilizzo incontrerai il problema della disconnessione della connessione; una volta disconnesso, questo codice segnala un errore che farà riattaccare consumatori o produttori.

La foto seguente mostra il produttore che invia un messaggio, ho fermato manualmente rabbitmq e poi ho riavviato rabbitmq, probabilmente dopo che l'avvio è andato bene, ho aspettato altri 10 secondi per impedire che il servizio iniziasse completamente

Dopo che il servizio è completamente avviato, cerco di riinviare alcuni messaggi con errori come segue:

Testo insolito **************
RabbitMQ.Client.Exceptions.AlreadyClosedException: Already closed: The AMQP operation was interrupted: AMQP close-reason, initiated by Peer, code=320, text="CONNECTION_FORCED - broker forced connection closure with reason 'shutdown'", classId=0, methodId=0, cause=
   In RabbitMQ.Client.Impl.SessionBase.Transmit(Command cmd)
   su RabbitMQ.Client.Impl.ModelBase.ModelSend(metodo MethodBase, intestazione ContentHeaderBase, corpo Byte[])
   su RabbitMQ.Client.Impl.ModelBase.BasicPublish(Scambio stringhe, Chiave di routing stringhe, obbligatorio booleano, IBasicProperties basicProperties, corpo di byte[]
   su RabbitMQ.Client.Impl.ModelBase.BasicPublish(Scambio stringhe, StringRoutingKey, IBasicProperties basicProperties, Byte[] body)
   A rabbitMQ_Publish.Form1.button1_Click(Object sender, EventArgs e) posizione C:\project\my\RabbitMQ-demo\rabbitMQ-Publish\Form1.cs: numero riga 37
   In System.Windows.Forms.Control.OnClick(EventArgs e)
   In System.Windows.Forms.Button.OnClick(EventArgs e)
   In System.Windows.Forms.Button.PerformClick()
   su System.Windows.Forms.Form.ProcessDialogKey(Chiavi keyData)
   su System.Windows.Forms.TextBoxBase.ProcessDialogKey(Keys keyData)
   In System.Windows.Forms.Control.PreProcessMessage(Message& msg)
   In System.Windows.Forms.Control.PreProcessControlControlMessageInternal(Control target, Message& msg)
   Su System.Windows.Forms.Application.ThreadContext.PreTranslateMessage(MSG& msg)





Quindi, come può essere guarito in modo anomalo? Oppure è scollegato e ricollegato?

Il codice sorgente del client RabbitMQ NET, la ricerca ne ha trovato unoRecuperoAutomaticoAbilitato = veroEcco come usarlo


Il meccanismo specifico di recupero è il seguente

1. Quando AutoRecoveringConnection viene inizializzato, aggiungere la gestione della disconnessione al delegato evento di chiusura del collegamento


Osserva la chiamata BeginAutomaticRecovery e puoi vedere che il metodo PerformAutomaticRecovery viene chiamato internamente. Guardiamo direttamente al contenuto di questo metodo, il primo dei quali è il metodo RecoverConnectionDelegate



La chiamata in questo metodo è:

Come puoi vedere, esegue un ciclo morto finché la connessione non si riapre e, ovviamente, se incontra un'eccezione, chiama Thread.Sleep per aspettare un po' e poi esegue nuovamente il recupero della connessione.




Precedente:Introduzione alle tre modalità di scambio (fanout, direct e topic) di RabbitMQ
Prossimo:Ti insegno come configurare il tuo server DNS!
Disconoscimento:
Tutto il software, i materiali di programmazione o gli articoli pubblicati dalla Code Farmer Network sono destinati esclusivamente all'apprendimento e alla ricerca; I contenuti sopra elencati non devono essere utilizzati per scopi commerciali o illegali, altrimenti gli utenti dovranno sostenere tutte le conseguenze. Le informazioni su questo sito provengono da Internet, e le controversie sul copyright non hanno nulla a che fare con questo sito. Devi eliminare completamente i contenuti sopra elencati dal tuo computer entro 24 ore dal download. Se ti piace il programma, ti preghiamo di supportare software autentico, acquistare la registrazione e ottenere servizi autentici migliori. In caso di violazione, vi preghiamo di contattarci via email.

Mail To:help@itsvse.com