Тази статия е огледална статия за машинен превод, моля, кликнете тук, за да преминете към оригиналната статия.

Изглед: 24043|Отговор: 0

[WinForm] .net/c# RabbitMQ прекъсване на връзката - прекъсване и повторно свързване

[Копирай линк]
Публикувано в 29.03.2018 г. 16:30:04 ч. | | | |
Официалният потребителски код за 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, за да изчака известно време, след което възстановява връзката отново.




Предишен:Въведение в трите режима на обмен (фанаут, директен и тематичен режим) на RabbitMQ
Следващ:Ще те науча как да настроиш собствен DNS сървър!
Отричане:
Целият софтуер, програмни материали или статии, публикувани от Code Farmer Network, са само за учебни и изследователски цели; Горното съдържание не трябва да се използва за търговски или незаконни цели, в противен случай потребителите ще понесат всички последствия. Информацията на този сайт идва от интернет, а споровете за авторски права нямат нищо общо с този сайт. Трябва напълно да изтриете горното съдържание от компютъра си в рамките на 24 часа след изтеглянето. Ако ви харесва програмата, моля, подкрепете оригинален софтуер, купете регистрация и получете по-добри услуги. Ако има нарушение, моля, свържете се с нас по имейл.

Mail To:help@itsvse.com