|
|
Objavljeno na 29. 03. 2018 16:30:04
|
|
|
|

Uradna NET koda za potrošnike, ki jo ponuja Rabbitmq, je naslednja, vendar se boste med uporabo srečali s težavo prekinitve povezave; ko je koda prekinjena, bo ta koda poročala o napaki, zaradi katere bodo potrošniki ali proizvajalci prekinili klic.
Na naslednji sliki je producent poslal sporočilo, ročno sem ustavil rabbitmq in nato ponovno zagnal rabbitmq, verjetno po uspešnem zagonu, čakal sem še 10 sekund, da preprečim popoln zagon storitve
Ko je storitev popolnoma zagnana, poskušam ponovno poslati nekaj sporočil z napakami, kot sledi:
Nenavadno besedilo **************
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= V RabbitMQ.Client.Impl.SessionBase.Transmit(Command cmd) at RabbitMQ.Client.Impl.ModelBase.ModelSend(MethodBase method, ContentHeaderBase header, Byte[] body) na RabbitMQ.Client.Impl.ModelBase.BasicPublish(String exchange, String routingKey, Boolean obvezno, IBasicProperties basicProperties, Byte[] body) na RabbitMQ.Client.Impl.ModelBase.BasicPublish(Izmenjava nizov, String routingKey, IBasicProperties basicProperties, Byte[] body) Na rabbitMQ_Publish.Form1.button1_Klik(Object sender, EventArgs e) položaj C:\project\my\RabbitMQ-demo\rabbitMQ-Publish\Form1.cs: vrstica številka 37 In System.Windows.Forms.Control.OnClick(EventArgs e) In System.Windows.Forms.Button.OnClick(EventArgs e) V System.Windows.Forms.Button.PerformClick() at System.Windows.Forms.Form.ProcessDialogKey(Keys keyData) at System.Windows.Forms.TextBoxBase.ProcessDialogKey(Keys keyData) V System.Windows.Forms.Control.PreProcessMessage(Message& msg) V System.Windows.Forms.Control.PreProcessControlMessageInternal(Control target, Message& msg) At System.Windows.Forms.Application.ThreadContext.PreTranslateMessage(MSG& msg)
Kako se torej lahko nenormalno obnovi? Ali je odklopljen in ponovno povezan?
Izvorna koda RabbitMQ NET odjemalca, raziskava je odkrilaAutomaticRecoveryEnabled = resTukaj je, kako ga uporabljati
Specifičen mehanizem okrevanja je naslednji
1. Ko se inicializira AutoRecoveringConnection, dodajte obravnavo prekinitve povezave delegatu za dogodek zaprtja povezave
Opazujte klic BeginAutomaticRecovery in lahko vidite, da je metoda PerformAutomaticRecovery klicana interno. Poglejmo si neposredno vsebino te metode, prva med njimi je metoda RecoverConnectionDelegate
Klic v tej metodi je:
Kot vidite, izvede mrtvo zanko, dokler se povezava ne odpre, in seveda, če naleti na izjemo, pokliče Thread.Sleep, da počaka nekaj časa, nato pa ponovno izvede obnovitev povezave.
|
Prejšnji:Uvod v tri načine izmenjave (fanout, direct in topic) v RabbitMQNaslednji:Naučil vas bo, kako nastaviti svoj DNS strežnik!
|