Den officielle NET-forbrugerkode, som Rabbitmq giver, er som følger, men under brugsprocessen vil du støde på problemet med forbindelsesafbrydelse; når den er afbrudt, vil denne kode rapportere en fejl, hvilket får forbrugere eller producenter til at lægge på.
Billedet nedenfor viser producenten, der sender en besked, jeg stoppede manuelt rabbitmq, og genstartede derefter rabbitmq, sandsynligvis efter starten var lykkedes, jeg ventede yderligere 10 sekunder for at forhindre, at tjenesten startede helt
Når tjenesten er fuldt startet, prøver jeg at sende nogle beskeder igen med følgende fejl:
Usædvanlig 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 (Strengudveksling, Streng routingKey, boolesk mandatory, IBasicProperties basicProperties, Byte[] body) på RabbitMQ.Client.Impl.ModelBase.BasicPublish (Strengudveksling, Streng routingKey, IBasicProperties basicProperties, Byte[] body) På rabbitMQ_Publish.Form1.button1_Click(Object sender, EventArgs e) position 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 blive unormalt genoprettet? Eller bliver den afbrudt og genforbundet?
Kildekoden til RabbitMQ NET Client, forskningen fandt enAutomaticRecoveryEnabled = sandSådan bruger du det
Den specifikke genopretningsmekanisme er som følger
1. Når AutoRecoveringConnection initialiseres, tilføj frakoblingshåndtering til linklukningsbegivenhedsdelegaten
Observer BeginAutomaticRecovery-kaldet, og du kan se, at PerformAutomaticRecovery-metoden kaldes internt. Lad os se direkte på indholdet af denne metode, hvor den første er metoden RecoverConnectionDelegate
Kaldet i denne metode er:
Som du kan se, kører den en død løkke, indtil forbindelsen åbner igen, og selvfølgelig, hvis den støder på en undtagelse, kalder den Thread.Sleep for at vente et stykke tid og udfører derefter forbindelsesgendannelse igen.
|