Ten artykuł jest lustrzanym artykułem tłumaczenia maszynowego, kliknij tutaj, aby przejść do oryginalnego artykułu.

Widok: 24043|Odpowiedź: 0

[WinForm] .net/c# Rozłączenie połączenia RabbitMQ – rozłączenie i ponowne połączenie

[Skopiuj link]
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 RabbitMQ
Następny:Nauczę cię, jak skonfigurować własny serwer DNS!
Zrzeczenie się:
Całe oprogramowanie, materiały programistyczne lub artykuły publikowane przez Code Farmer Network służą wyłącznie celom edukacyjnym i badawczym; Powyższe treści nie mogą być wykorzystywane do celów komercyjnych ani nielegalnych, w przeciwnym razie użytkownicy ponoszą wszelkie konsekwencje. Informacje na tej stronie pochodzą z Internetu, a spory dotyczące praw autorskich nie mają z nią nic wspólnego. Musisz całkowicie usunąć powyższą zawartość z komputera w ciągu 24 godzin od pobrania. Jeśli spodoba Ci się program, wspieraj oryginalne oprogramowanie, kup rejestrację i korzystaj z lepszych, autentycznych usług. W przypadku naruszenia praw prosimy o kontakt mailowy.

Mail To:help@itsvse.com