Der offizielle NET-Verbraucher-Beispielcode von Rabbitmq lautet wie folgt: Während des Nutzungsprozesses treten Sie auf das Problem der Verbindungsabbrüche. Nach der Trennung meldet dieser Code einen Fehler, der dazu führt, dass Konsumenten oder Hersteller auflegen.
Das folgende Bild zeigt, wie der Hersteller eine Nachricht sendet: Ich habe rabbitmq manuell gestoppt und dann rabbitmq neu gestartet, wahrscheinlich nachdem der Start erfolgreich war, ich habe weitere 10 Sekunden gewartet, um zu verhindern, dass der Service komplett startet.
Nachdem der Dienst vollständig gestartet ist, versuche ich, einige Nachrichten mit folgenden Fehlern erneut zu senden:
Ungewöhnlicher 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= In RabbitMQ.Client.Impl.SessionBase.Transmit(Command cmd) at RabbitMQ.Client.Impl.ModelBase.ModelSend(MethodBase-Methode, ContentHeaderBase-Header, Byte[] body) bei RabbitMQ.Client.Impl.ModelBase.BasicPublish (String-Austausch, String-RoutingKey, boolesche mandatory, IBasicProperties basicProperties, Byte[]-Body) bei RabbitMQ.Client.Impl.ModelBase.BasicPublish (String-Austausch, String-RoutingKey, IBasicProperties basicProperties, Byte[]-Body) Unter rabbitMQ_Publish.Form1.button1_Click(Objektsender, EventArgs e) Position C:\project\my\RabbitMQ-demo\rabbitMQ-Publish\Form1.cs: Zeilennummer 37 In System.Windows.Forms.Control.OnClick(EventArgs e) In System.Windows.Forms.Button.OnClick(EventArgs e) In System.Windows.Forms.Button.PerformClick() bei System.Windows.Forms.Form.ProcessDialogKey(Keys keyData) bei 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) Bei System.Windows.Forms.Application.ThreadContext.PreTranslateMessage(MSG& msg)
Wie kann es also abnormal wiederhergestellt werden? Oder wird es getrennt und wieder angeschlossen?
Der Quellcode des RabbitMQ NET Client, die Forschung ergab einen solchenAutomaticRecoveryEnabled = trueSo benutzt man es
Der spezifische Wiederherstellungsmechanismus ist wie folgt
1. Wenn AutoRecoveringConnection initialisiert wird, fügen Sie die Disconnection-Handling dem Link-Close-Event-Delegaten hinzu
Beachten Sie den Aufruf BeginAutomaticRecovery, und Sie sehen, dass die Methode PerformAutomaticRecovery intern aufgerufen wird. Schauen wir uns direkt den Inhalt dieser Methode an, wobei die erste die Methode RecoverConnectionDelegate ist
Der Aufruf in dieser Methode lautet:
Wie du siehst, führt es eine Deadloop aus, bis die Verbindung wieder geöffnet wird, und natürlich, wenn es eine Ausnahme gibt, ruft es Thread.Sleep auf, um eine Weile zu warten, und führt dann erneut die Verbindungswiederherstellung durch.
|