Офіційний зразок споживчого коду 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, щоб трохи почекати, а потім знову виконує відновлення з'єднання.
|