De officiële NET-consumentencode van Rabbitmq is als volgt, maar tijdens het gebruik krijg je het probleem van verbindingsverbreking; zodra deze code wordt losgekoppeld, rapporteert deze code een fout, waardoor consumenten of producenten ophangen.
De volgende foto toont de producent die een bericht stuurt, ik heb rabbitmq handmatig gestopt en daarna rabbitmq opnieuw gestart, waarschijnlijk nadat de start succesvol was, ik heb nog 10 seconden gewacht om te voorkomen dat de service volledig werd gestart
Nadat de dienst volledig is gestart, probeer ik enkele berichten opnieuw te sturen met de volgende fouten:
Ongebruikelijke 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= In RabbitMQ.Client.Impl.SessionBase.Transmit(Command cmd) op RabbitMQ.Client.Impl.ModelBase.ModelSend(MethodBase-method, ContentHeaderBase-header, Byte[] body) op RabbitMQ.Client.Impl.ModelBase.BasicPublish (String-uitwisseling, String routingKey, Boolean mandatory, IBasicProperties basicProperties, Byte[] body) op RabbitMQ.Client.Impl.ModelBase.BasicPublish(String-uitwisseling, String routingKey, IBasicProperties basicProperties, Byte[] body) Op rabbitMQ_Publish.Form1.button1_Click(Object sender, EventArgs e) positie C:\project\my\RabbitMQ-demo\rabbitMQ-Publish\Form1.cs: regel nummer 37 In System.Windows.Forms.Control.OnClick(EventArgs e) In System.Windows.Forms.Button.OnClick(EventArgs e) In System.Windows.Forms.Button.PerformClick() op System.Windows.Forms.Form.ProcessDialogKey(Keys keyData) op System.Windows.Forms.TextBoxBase.ProcessDialogKey(Keys keyData) In System.Windows.Forms.Control.PreProcessMessage(Message& msg) In System.Windows.Forms.Control.PreProcessControlMessageInternal(Control target, Message& msg) Op System.Windows.Forms.Application.ThreadContext.PreTranslateMessage(MSG& msg)
Hoe kan het dan abnormaal worden hersteld? Of wordt hij losgekoppeld en weer aangesloten?
De broncode van de RabbitMQ NET Client, het onderzoek vond er eenAutomaticRecoveryEnabled = waarZo gebruik je het
Het specifieke herstelmechanisme is als volgt
1. Wanneer AutoRecoveringConnection wordt geïnitialiseerd, voeg dan disconnection handling toe aan de link close event delegate
Let op de BeginAutomaticRecovery-aanroep, en je ziet dat de PerformAutomaticRecovery-methode intern wordt aangeroepen. Laten we direct naar de inhoud van deze methode kijken, waarvan de eerste de methode RecoverConnectionDelegate is
De aanroep in deze methode is:
Zoals je ziet, voert het een dead loop uit totdat de verbinding weer wordt geopend, en natuurlijk, als er een uitzondering tegenkomt, roept het Thread.Sleep aan om even te wachten en voert dan opnieuw verbindingsherstel uit.
|