|
|
게시됨 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 서버를 설정하는 방법을 알려드릴 수 있습니다!
|