Официалният потребителски код за NET, предоставен от Rabbitmq, е следният, но по време на процеса на използване ще се сблъскате с проблем с прекъсване на връзката – след като се прекъсне, този код ще съобщи за грешка, което ще накара потребителите или производителите да прекъснат разговора.
Следващата снимка показва как продуцентът изпраща съобщение, ръчно спрях rabbitmq и после рестартирах rabbitmq, вероятно след като стартът беше успешен, изчаках още 10 секунди, за да предотвратя пълното стартиране на услугата
След като услугата е напълно стартирана, се опитвам да изпратя отново някои съобщения с грешки, както следва:
Необичаен текстов **************
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) at RabbitMQ.Client.Impl.ModelBase.ModelSend(MethodBase method, ContentHeaderBase header, Byte[] тяло) at RabbitMQ.Client.Impl.ModelBase.BasicPublish(Обмен на низове, String routingKey, булев задължителен, IBasicProperties basicProperties, Byte[] тяло) at RabbitMQ.Client.Impl.ModelBase.BasicPublish(Размяна на низове, Низови маршрутиKey, IBasicProperties basicProperties, Byte[] тяло) На rabbitMQ_Publish.Form1.button1_Click(Изпращач на обекта, EventArgs e) позиция C:\project\my\RabbitMQ-demo\rabbitMQ-Publish\Form1.cs: ред номер 37 В System.Windows.Forms.Control.OnClick(EventArgs e) В System.Windows.Forms.Button.OnClick(EventArgs e) В System.Windows.Forms.Button.PerformClick() в System.Windows.Forms.Form.ProcessDialogKey(Ключове keyData) в System.Windows.Forms.TextBoxBase.ProcessDialogKey(Keys keyData) В System.Windows.Forms.Control.PreProcessMessage(Message&msg) В System.Windows.Forms.Control.PreProcessControlMessageInternal(Control target, Message&msg) В System.Windows.Forms.Application.ThreadContext.PreTranslateMessage(MSG&msg)
Тогава как може да бъде възстановен необичайно? Или е изключен и свързан отново?
Изходният код на RabbitMQ NET Client, изследването откри такъвAutomaticRecoveryEnabled = trueЕто как да го използвате
Конкретният механизъм за възстановяване е следният
1. Когато AutoRecoveringConnection се инициализира, добавете обработката на прекъсване към делегата на събитието за затваряне на връзката
Наблюдавайте повикването BeginAutomaticRecovery и ще видите, че методът PerformAutomaticRecovery се извиква вътрешно. Нека разгледаме директно съдържанието на този метод, първият от които е методът RecoverConnectionDelegate
Повикването в този метод е:
Както виждате, той изпълнява мъртъв цикъл, докато връзката се отвори отново, и разбира се, ако срещне изключение, извиква Thread.Sleep, за да изчака известно време, след което възстановява връзката отново.
|