Эта статья является зеркальной статьёй машинного перевода, пожалуйста, нажмите здесь, чтобы перейти к оригиналу.

Вид: 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, Byte[] body)
   at RabbitMQ.Client.Impl.ModelBase.BasicPublish(обмен строками, ключ маршрутизации строк, булевый обязательный, IBasicProperties basicProperties, тело байта)
   at RabbitMQ.Client.Impl.ModelBase.BasicPublish(Обмен строками, String routingKey, IBasicProperties basicProperties, Byte[] body)
   В rabbitMQ_Publish.Form1.button1_Click(Отправитель объекта, 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