|
|
Paskelbta 2018-03-29 16:30:04
|
|
|
|

Oficialus "Rabbitmq" pateiktas NET vartotojo pavyzdžio kodas yra toks, tačiau naudojimo metu susidursite su ryšio atjungimo problema, atjungus šį kodą bus pranešta apie klaidą, dėl kurios vartotojai ar gamintojai padės ragelį.
Šiame paveikslėlyje parodyta, kaip gamintojas siunčia pranešimą, aš rankiniu būdu sustabdžiau rabbitmq, o tada iš naujo paleidau rabbitmq, tikriausiai po to, kai paleidimas buvo sėkmingas, palaukiau dar 10 sekundžių, kad paslauga neprasidėtų visiškai
Visiškai paleidus paslaugą, bandau iš naujo išsiųsti kai kuriuos pranešimus su klaidomis taip:
Neįprasta teksto **************
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(Komanda cmd) at RabbitMQ.Client.Impl.ModelBase.ModelSend(MethodBase metodas, ContentHeaderBase antraštė, Byte[] body) at RabbitMQ.Client.Impl.ModelBase.BasicPublish(Eilučių mainai, Eilutės maršrutizavimo raktas, Bulio logikos privalomas, IBasicProperties basicProperties, Byte[] body) at RabbitMQ.Client.Impl.ModelBase.BasicPublish(String exchange, String routingKey, IBasicProperties basicProperties, Byte[] body) Prie rabbitMQ_Publish.Form1.button1_Click(Objekto siuntėjas, EventArgs e) pozicija C:\project\my\RabbitMQ-demo\rabbitMQ-Publish\Form1.cs: eilutės numeris 37 System.Windows.Forms.Control.OnClick(EventArgs e) System.Windows.Forms.Button.OnClick(EventArgs e) In System.Windows.Forms.Button.PerformClick() System.Windows.Forms.Form.ProcessDialogKey(Keys keyData) System.Windows.Forms.TextBoxBase.ProcessDialogKey(Keys keyData) System.Windows.Forms.Control.PreProcessMessage(Pranešimas& msg) System.Windows.Forms.Control.PreProcessControlMessageInternal(Valdymo tikslas, Pranešimas ir pranešimas) System.Windows.Forms.Application.ThreadContext.PreTranslateMessage(MSG& msg)
Taigi, kaip jis gali būti neįprastai atkurtas? O gal jis atjungtas ir vėl prijungtas?
Tyrimas nustatė, kad "RabbitMQ NET Client" šaltinio kodasAutomaticRecoveryEnabled = teisingaŠtai kaip juo naudotis
Specialus susigrąžinimo mechanizmas yra toks
1. Kai inicijuojamas automatinis atkūrimas, pridėkite atjungimo tvarkymą prie nuorodos uždarymo įvykio atstovo
Stebėkite "BeginAutomaticRecovery" skambutį ir pamatysite, kad "PerformAutomaticRecovery" metodas iškviečiamas viduje. Pažvelkime tiesiai į šio metodo turinį, iš kurių pirmasis yra metodas "RecoverConnectionDelegate"
Šio metodo skambutis yra:
Kaip matote, jis vykdo negyvą kilpą, kol ryšys vėl atsidaro, ir, žinoma, jei susiduria su išimtimi, iškviečia "Thread.Sleep", kad šiek tiek palauktų, o tada vėl atkuria ryšį.
|
Ankstesnis:Įvadas į tris RabbitMQ mainų režimus (fanout, tiesioginis ir tema)Kitą:Išmokykite, kaip nustatyti savo DNS serverį!
|