이 글은 기계 번역의 미러 문서이며, 원본 기사로 바로 이동하려면 여기를 클릭해 주세요.

보기: 24043|회답: 0

[윈폼] .net/c# RabbitMQ 연결 끊김 - 연결 해제 및 재연결

[링크 복사]
게시됨 2018. 3. 29. 오후 4:30:04 | | | |
Rabbitmq에서 제공하는 공식 NET 소비자 샘플 코드는 다음과 같지만, 사용 과정에서 연결 끊김 문제를 겪게 됩니다. 연결이 끊기면 이 코드가 오류를 보고하여 소비자나 제작자가 전화를 끊게 됩니다.

다음 사진은 프로듀서가 메시지를 보내는 모습을 보여주었고, 저는 수동으로 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=
   In RabbitMQ.Client.Impl.SessionBase.Transmit(명령 cmd)
   at RabbitMQ.Client.Impl.ModelBase.ModelSend(MethodBase method, ContentHeaderBase header, Byte[] body)
   at RabbitMQ.Client.Impl.ModelBase.BasicPublish(String exchange, String routingKey, Boolean mandatory, IBasicProperties basicProperties, Byte[] body)
   at RabbitMQ.Client.Impl.ModelBase.BasicPublish(문자열 교환, 문자열 라우팅키, IBasicProperties basicProperties, Byte[] body)
   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)
   In System.Windows.Forms.Button.OnClick(EventArgs e)
   In System.Windows.Forms.Button.PerformClick()
   at System.Windows.Forms.Form.ProcessDialogKey(Keys keyData)
   at 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 클라이언트의 소스 코드가 발견되었습니다AutomaticRecoveryEnabled = 참사용법은 다음과 같습니다


구체적인 회복 메커니즘은 다음과 같습니다

1. AutoRecoveringConnection이 초기화될 때, 링크 닫기 이벤트 위임에 연결 해제 처리를 추가하세요


BeginAutomaticRecovery 호출을 관찰하면 내부적으로 PerformAutomaticRecovery 메서드가 호출된 것을 알 수 있습니다. 이 메서드의 내용을 직접 살펴보겠습니다. 첫 번째는 RecoverConnectionDelegate 메서드입니다



이 메서드에서의 호출은 다음과 같습니다:

보시다시피, 연결이 다시 열릴 때까지 데드 루프를 실행하고, 예외가 발생하면 Thread.Sleep을 호출해 잠시 기다린 후 다시 연결 복구를 수행합니다.




이전의:RabbitMQ의 세 가지 교환 모드(팬아웃, 다이렉트, 토픽) 소개
다음:직접 DNS 서버를 설정하는 방법을 알려드릴 수 있습니다!
면책 조항:
Code Farmer Network에서 발행하는 모든 소프트웨어, 프로그래밍 자료 또는 기사는 학습 및 연구 목적으로만 사용됩니다; 위 내용은 상업적 또는 불법적인 목적으로 사용되지 않으며, 그렇지 않으면 모든 책임이 사용자에게 부담됩니다. 이 사이트의 정보는 인터넷에서 가져온 것이며, 저작권 분쟁은 이 사이트와는 관련이 없습니다. 위 내용은 다운로드 후 24시간 이내에 컴퓨터에서 완전히 삭제해야 합니다. 프로그램이 마음에 드신다면, 진짜 소프트웨어를 지원하고, 등록을 구매하며, 더 나은 진짜 서비스를 받아주세요. 침해가 있을 경우 이메일로 연락해 주시기 바랍니다.

Mail To:help@itsvse.com