Den officiella NET-konsumentkoden som ges av Rabbitmq är följande, men under användningsprocessen kommer du att stöta på problemet med anslutningsavbrott, och när den är frånkopplad rapporterar denna kod ett fel, vilket gör att konsumenter eller producenter lägger på.
Följande bild visar producenten som skickar ett meddelande, jag avslutade rabbitmq manuellt och startade sedan om rabbitmq, troligen efter att starten var lyckad, jag väntade ytterligare 10 sekunder för att förhindra att tjänsten startade helt
När tjänsten är helt igång försöker jag skicka om några meddelanden med följande felmeddelanden:
Ovanlig text **************
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) på RabbitMQ.Client.Impl.ModelBase.ModelSend(MethodBase-metoden, ContentHeaderBase-header, Byte[] body) på RabbitMQ.Client.Impl.ModelBase.BasicPublish (Strängutbyte, SträngroutingKey, boolesk mandator, IBasicProperties basicProperties, Byte[]-kropp) på RabbitMQ.Client.Impl.ModelBase.BasicPublish(Strängutbyte, SträngroutingKey, IBasicProperties basicProperties, Byte[]-kropp) På rabbitMQ_Publish.Form1.button1_Click(Object sender, EventArgs e) position C:\project\my\RabbitMQ-demo\rabbitMQ-Publish\Form1.cs: radnummer 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å hur kan det återhämtas onormalt? Eller kopplas den bort och återansluts?
Källkoden till RabbitMQ NET Client, forskningen fann en sådanAutomaticRecoveryEnabled = trueSå här använder du den
Den specifika återhämtningsmekanismen är som följer
1. När AutoRecoveringConnection initieras, lägg till avbrottshantering till länkstängningshändelsedelegaten
Observera anropet BeginAutomaticRecovery, så kan du se att PerformAutomaticRecovery-metoden kallas internt. Låt oss titta direkt på innehållet i denna metod, där den första är metoden RecoverConnectionDelegate
Anropet i denna metod är:
Som du kan se kör den en dödloop tills anslutningen öppnas igen, och om den stöter på ett undantag anropar den Thread.Sleep för att vänta en stund och utför sedan anslutningsåterställning igen.
|