Codul oficial NET pentru consumatori oferit de Rabbitmq este următorul, dar în timpul procesului de utilizare veți întâmpina problema deconectării conexiunii; odată deconectat, acest cod va raporta o eroare care va determina consumatorii sau producătorii să închidă telefonul.
Următoarea imagine arată producătorul trimițând un mesaj, am oprit manual rabbitmq, apoi am repornit rabbitmq, probabil după ce pornirea a fost reușită, am mai așteptat încă 10 secunde ca să împiedic pornirea completă a serviciului
După ce serviciul este complet pornit, încerc să retrimit câteva mesaje cu erori după cum urmează:
Text neobișnuit **************
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= În RabbitMQ.Client.Impl.SessionBase.Transmit(Command cmd) la RabbitMQ.Client.Impl.ModelBase.ModelSend(metoda MethodBase, antetul ContentHeaderBase, corpul Byte[]) la RabbitMQ.Client.Impl.ModelBase.BasicPublish(Schimb de șiruri, String routingKey, Boolean obligatoriu, IBasicProperties basicProperties, corp Byte[]) la RabbitMQ.Client.Impl.ModelBase.BasicPublish(Schimb de șiruri, Cheie de rutare de șiruri, IBasicProperties basicProperties, corp Byte[]) La rabbitMQ_Publish.Form1.button1_Click(Object sender, EventArgs e) poziția C:\project\my\RabbitMQ-demo\rabbitMQ-Publish\Form1.cs: linia numărul 37 În System.Windows.Forms.Control.OnClick(EventArgs e) În System.Windows.Forms.Button.OnClick(EventArgs e) În System.Windows.Forms.Button.PerformClick() la System.Windows.Forms.Form.ProcessDialogKey(Keys keyData) la System.Windows.Forms.TextBoxBase.ProcesDialogKey(Chei, keyData) În System.Windows.Forms.Control.PreProcessMessage(Message& msg) În System.Windows.Forms.Control.PreProcessControlMessageInternal(Control target, Message& msg) La System.Windows.Forms.Application.ThreadContext.PreTranslateMessage(MSG& msg)
Deci cum poate fi recuperată anormal? Sau este deconectat și reconectat?
Codul sursă al clientului RabbitMQ NET, cercetarea a găsit unulAutomatRecoveryEnabled = adevăratIată cum să o folosești
Mecanismul specific de recuperare este următorul
1. Când AutoRecoveringConnection este inițializat, adăugați gestionarea deconectării la delegatul evenimentului de închidere a legăturii
Observați apelul BeginAutomaticRecovery și puteți vedea că metoda PerformAutomaticRecovery este numită intern. Să analizăm direct conținutul acestei metode, prima fiind metoda RecoverConnectionDelegate
Apelul în această metodă este:
După cum vezi, execută o buclă moartă până când conexiunea se redeschide și, desigur, dacă întâlnește o excepție, apelează la Thread.Sleep să aștepte puțin și apoi efectuează din nou recuperarea conexiunii.
|