|
|
Julkaistu 29.3.2018 16.30.04
|
|
|
|

Rabbitmq:n antama virallinen NET-kuluttajakoodi on seuraava, mutta käyttöprosessin aikana kohtaat yhteyden katkeamisen ongelman; kun yhteys katkeaa, tämä koodi raportoi virheen, joka saa kuluttajat tai tuottajat lopettamaan puhelun.
Seuraavassa kuvassa tuottaja lähettää viestin, pysäytin rabbitmq:n manuaalisesti ja käynnistin rabbitmq:n uudelleen, luultavasti käynnistyksen jälkeen odotin vielä 10 sekuntia estääkseni palvelun käynnistymisen kokonaan
Kun palvelu on täysin käynnistynyt, yritän lähettää joitakin virheviestejä uudelleen seuraavasti:
Epätavallinen teksti **************
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= RabbitMQ.Client.Impl.SessionBase.Transmit(Command cmd) -muodossa osoitteessa RabbitMQ.Client.Impl.ModelBase.ModelSend(MethodBase-metodi, ContentHeaderBase-otsikko, tavu[] runko) osoitteessa RabbitMQ.Client.Impl.ModelBase.BasicPublish (Merkkijonojen vaihto, String routingKey, Boolean mandatory, IBasicProperties basicProperties, Byte[] body) osoitteessa RabbitMQ.Client.Impl.ModelBase.BasicPublish (merkkijonojen vaihto, merkkijonojen reititysavain, IBasicProperties basicProperties, tavu[] runko) Osoitteessa rabbitMQ_Publish.Form1.button1_Click(Object sender, EventArgs e) sijainti C:\project\my\RabbitMQ-demo\rabbitMQ-Publish\Form1.cs: rivinumero 37 In System.Windows.Forms.Control.OnClick(EventArgs e) System.Windows.Forms.Button.OnClick(EventArgs e) In System.Windows.Forms.Button.PerformClick() osoitteessa System.Windows.Forms.Form.ProcessDialogKey(Keys keyData) osoitteessa System.Windows.Forms.TextBoxBase.ProcessDialogKey(Keys keyData) System.Windows.Forms.Control.PreProcessMessage(Message&msg) System.Windows.Forms.Control.PreProcessControlMessageInternal(Control target, Message&msg) Osoitteessa System.Windows.Forms.Application.ThreadContext.PreTranslateMessage(MSG&msg)
Miten se sitten voidaan toiputtaa epänormaalisti? Vai onko se irrotettu ja kytketty uudestaan?
RabbitMQ NET Clientin lähdekoodi, tutkimuksessa löydettiin yksiAutomaticRecoveryEnabled = trueNäin sitä käytetään
Erityinen palautusmekanismi on seuraava
1. Kun AutoRecoveringConnection on alustettu, lisää yhteyden katkaisun käsittely linkin sulkemistapahtuman delegaattiin
Seuraa BeginAutomaticRecovery-kutsua, niin näet, että PerformAutomaticRecovery-metodi kutsutaan sisäisesti. Katsotaanpa suoraan tämän metodin sisältöä, joista ensimmäinen on menetelmä RecoverConnectionDelegate
Tämän menetelmän kutsu on:
Kuten näet, se suorittaa kuolleen silmukan, kunnes yhteys avautuu uudelleen, ja tietysti, jos se kohtaa poikkeuksen, se kutsuu Thread.Sleepin odottamaan hetken ja suorittaa sitten yhteyden palautuksen uudelleen.
|
Edellinen:Johdanto RabbitMQ:n kolmeen vaihtotilaan (fanout, suora ja aihe)Seuraava:Opetan sinulle, miten perustaa oma DNS-palvelin!
|