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.
|