Официальный потребительский код 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 для некоторого ожидания, а затем снова выполняет восстановление соединения.
|