Oficiālais NET patērētāja parauga kods, ko sniedz Rabbitmq, ir šāds, bet lietošanas procesa laikā jūs saskarsieties ar savienojuma atvienošanas problēmu, pēc atvienošanas šis kods ziņos par kļūdu, kas izraisīs patērētāju vai ražotāju uzkarināšanos.
Nākamajā attēlā redzams, ka ražotājs nosūta ziņojumu, es manuāli apturēju rabbitmq un pēc tam restartēju rabbitmq, iespējams, pēc veiksmīga starta, es gaidīju vēl 10 sekundes, lai novērstu pakalpojuma pilnīgu sākšanu
Pēc tam, kad pakalpojums ir pilnībā startēts, es mēģinu atkārtoti nosūtīt dažus ziņojumus ar kļūdām šādi:
Neparasta teksta **************
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= TrusīMQ.Client.Impl.SessionBase.Transmit(Komanda cmd) at RabbitMQ.Client.Impl.ModelBase.ModelSend(MethodBase metode, ContentHeaderBase galvene, Byte[] body) at RabbitMQ.Client.Impl.ModelBase.BasicPublish(String exchange, String routingKey, Būla obligāts, IBasicProperties basicProperties, Byte[] body) at RabbitMQ.Client.Impl.ModelBase.BasicPublish(String exchange, String routingKey, IBasicProperties basicProperties, Byte[] body) Pie rabbitMQ_Publish.Form1.button1_Click(Objekta sūtītājs, EventArgs e) pozīcija C:\project\my\RabbitMQ-demo\rabbitMQ-Publish\Form1.cs: rindas numurs 37 Sistēmā System.Windows.Forms.Control.OnClick(EventArgs e) Sistēmā System.Windows.Forms.Button.OnClick(EventArgs e) Sistēmā System.Windows.Forms.Button.PerformClick() vietnē System.Windows.Forms.Form.ProcessDialogKey(Keys keyData) vietnē System.Windows.Forms.TextBoxBase.ProcessDialogKey(Keys keyData) Sistēmā System.Windows.Forms.Control.PreProcessMessage(Ziņojums& msg) Sistēmā System.Windows.Forms.Control.PreProcessControlMessageInternal(Vadības mērķis, Ziņojums un ziņojums) Vietnē System.Windows.Forms.Application.ThreadContext.PreTranslateMessage(MSG& msg)
Tātad, kā to var nenormāli atgūt? Vai arī tas ir atvienots un atkal savienots?
RabbitMQ NET Client avota kods, pētījumā tika atrasts viensAutomaticRecoveryEnabled = patiessLūk, kā to izmantot
Īpašs atgūšanas mehānisms ir šāds
1. Kad AutoRecoveringConnection ir inicializēts, pievienojiet atvienošanas apstrādi saites aizvēršanas notikuma pārstāvim
Ievērojiet BeginAutomaticRecovery izsaukumu, un jūs varat redzēt, ka PerformAutomaticRecovery metode tiek izsaukta iekšēji. Apskatīsim tieši šīs metodes saturu, no kuriem pirmais ir metode RecoverConnectionDelegate
Šīs metodes izsaukums ir:
Kā redzat, tas izpilda mirušo cilpu, līdz savienojums atkal tiek atvērts, un, protams, ja tas saskaras ar izņēmumu, tas izsauc Thread.Sleep, lai pagaidītu kādu laiku, un pēc tam atkal veic savienojuma atgūšanu.
|