Ця стаття є дзеркальною статтею машинного перекладу, будь ласка, натисніть тут, щоб перейти до оригінальної статті.

Вид: 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, заголовок ContentHeaderBase, тіло байта)
   на RabbitMQ.Client.Impl.ModelBase.BasicPublish(обмін рядками, ключ маршрутизації рядків, булевий обов'язковий, IBasicProperties basicProperties, тіло байта)
   на RabbitMQ.Client.Impl.ModelBase.BasicPublish(обмін рядками, маршрутизація рядків, IBasicProperties basicProperties, тіло байта)
   У rabbitMQ_Publish.Form1.button1_Click(Object sender, EventArgs e) позиція C:\project\my\RabbitMQ-demo\rabbitMQ-Publish\Form1.cs: рядок номер 37
   In System.Windows.Forms.Control.OnClick(EventArgs e)
   У System.Windows.Forms.Button.OnClick(EventArgs e)
   У System.Windows.Forms.Button.PerformClick()
   на System.Windows.Forms.Form.ProcessDialogKey(Keys 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