|
|
Opublikowano 29.03.2018 16:30:04
|
|
|
|

Oficjalny przykładowy kod NET udostępniony przez Rabbitmq jest następujący, ale podczas użytkowania napotkasz problem rozłączenia połączenia; po rozłączeniu ten kod zgłasza błąd, który spowoduje rozłączenie konsumentów lub producentów.
Poniższy obrazek pokazuje, że producent wysyła wiadomość, ręcznie zatrzymałem rabbitmq, a potem zrestartowałem rabbitmq, prawdopodobnie po pomyślnym uruchomieniu, czekałem kolejne 10 sekund, żeby uniemożliwić całkowite uruchomienie usługi
Po pełnym uruchomieniu usługi próbuję ponownie wysłać kilka wiadomości z błędami, jak następująco:
Nietypowy tekst **************
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= W RabbitMQ.Client.Impl.SessionBase.Transmit(Command cmd) at RabbitMQ.Client.Impl.ModelBase.ModelSend(metoda MethodBase, nagłówek ContentHeaderBase, Byte[] body) na RabbitMQ.Client.Impl.ModelBase.BasicPublish(Wymiana ciągów tekstów, String routingKey, Boolean obowiązkowy, IBasicProperties basicProperties, Byte[] body) at RabbitMQ.Client.Impl.ModelBase.BasicPublish(Wymiana łańcuchów, String routingKey, IBasicProperties basicProperties, Byte[] body) Na pozycji rabbitMQ_Publish.Form1.button1_Click(Object sender, EventArgs e) pozycja C:\project\my\RabbitMQ-demo\rabbitMQ-Publish\Form1.cs: linia numer 37 In System.Windows.Forms.Control.OnClick(EventArgs e) In System.Windows.Forms.Button.OnClick(EventArgs e) W System.Windows.Forms.Button.PerformClick() at System.Windows.Forms.Form.ProcessDialogKey(Keys keyData) at System.Windows.Forms.TextBoxBase.ProcessDialogKey(Keys keyData) W System.Windows.Forms.Control.PreProcessMessage(Message& msg) W System.Windows.Forms.Control.PreProcessControlMessageInternal(Target Control Message& msg) W: System.Windows.Forms.Application.ThreadContext.PreTranslateMessage(MSG& msg)
Jak więc można ją nienaturalnie odzyskać? A może jest odłączona i ponownie podłączona?
Kod źródłowy klienta RabbitMQ NET – wykazał badaniaAutomaticRecoveryEnabled = prawdziweOto jak go używać
Konkretny mechanizm odzyskania wygląda następująco
1. Gdy AutoRecoveringConnection zostanie zainicjowany, dodaj obsługę rozłączenia do delegata zdarzenia zamknięcia łącza
Obserwując wywołanie BeginAutomaticRecovery, zobaczysz, że metoda PerformAutomaticRecovery jest wywoływana wewnętrznie. Przyjrzyjmy się bezpośrednio zawartości tej metody, z której pierwszą jest metoda RecoverConnectionDelegate
Sygnał w tej metodzie to:
Jak widać, wykonuje martwą pętlę, dopóki połączenie się nie otworzy, a jeśli napotka wyjątek, wywołuje Thread.Sleep, aby poczekać chwilę, a potem ponownie wykonuje przywracanie połączenia.
|
Poprzedni:Wprowadzenie do trzech trybów wymiany (fanout, direct i topic) w RabbitMQNastępny:Nauczę cię, jak skonfigurować własny serwer DNS!
|