Den offisielle NET-forbrukerkoden gitt av Rabbitmq er som følger, men under bruksprosessen vil du støte på problemet med tilkoblingsbrudd; når den kobles fra, vil denne koden rapportere en feil, noe som vil føre til at forbrukere eller produsenter legger på.
Bildet nedenfor viser produsenten sende en melding, jeg stoppet rabbitmq manuelt, og startet rabbitmq på nytt, sannsynligvis etter at starten var vellykket, jeg ventet i ytterligere 10 sekunder for å hindre at tjenesten startet helt
Etter at tjenesten er helt i gang, prøver jeg å sende noen meldinger på nytt med følgende feil:
Uvanlig tekst **************
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= I RabbitMQ.Client.Impl.SessionBase.Transmit(Command cmd) at RabbitMQ.Client.Impl.ModelBase.ModelSend(MethodBase-metode, ContentHeaderBase-header, Byte[] body) på RabbitMQ.Client.Impl.ModelBase.BasicPublish(Strengutveksling, StrengrutingKey, boolsk mandatory, IBasicProperties basicProperties, Byte[]-kropp) på RabbitMQ.Client.Impl.ModelBase.BasicPublish(Strengutveksling, StrengrutingKey, IBasicProperties basicProperties, Byte[]-kropp) På rabbitMQ_Publish.Form1.button1_Click(Object sender, EventArgs e) posisjon C:\project\my\RabbitMQ-demo\rabbitMQ-Publish\Form1.cs: linje nummer 37 I System.Windows.Forms.Control.OnClick(EventArgs e) I System.Windows.Forms.Button.OnClick(EventArgs e) I System.Windows.Forms.Button.PerformClick() på System.Windows.Forms.Form.ProcessDialogKey(Keys keyData) på System.Windows.Forms.TextBoxBase.ProcessDialogKey(Keys keyData) I System.Windows.Forms.Control.PreProcessMessage(Message& msg) I System.Windows.Forms.Control.PreProcessControlMessageInternal(Control target, Message& msg) På System.Windows.Forms.Application.ThreadContext.PreTranslateMessage(MSG& msg)
Så hvordan kan det bli unormalt gjenopprettet? Eller er den koblet fra og koblet til igjen?
Kildekoden til RabbitMQ NET Client, forskningen fant énAutomaticRecoveryEnabled = trueSlik bruker du det
Den spesifikke gjenopprettingsmekanismen er som følger
1. Når AutoRecoveringConnection initialiseres, legg til frakoblingshåndtering i delegaten for lenkelukkingshendelsen
Se på BeginAutomaticRecovery-kallet, og du kan se at PerformAutomaticRecovery-metoden kalles internt. La oss se direkte på innholdet i denne metoden, hvor den første er metoden RecoverConnectionDelegate
Kallet i denne metoden er:
Som du ser, kjører den en død løkke til tilkoblingen åpnes igjen, og selvfølgelig, hvis den møter et unntak, kaller den Thread.Sleep for å vente en stund og utfører deretter tilkoblingsgjenoppretting igjen.
|