O código oficial de exemplo para consumidores NET fornecido pelo Rabbitmq é o seguinte, mas durante o processo de uso, você encontrará o problema de desconexão da conexão; uma vez desconectado, esse código reportará um erro, o que fará com que consumidores ou produtores desliguem.
A imagem a seguir mostra o produtor enviando uma mensagem, eu parei o rabbitmq manualmente e depois reiniciei o rabbitmq, provavelmente depois que o início foi bem-sucedido, esperei mais 10 segundos para impedir que o serviço começasse completamente
Depois que o serviço está totalmente iniciado, tento reenviar algumas mensagens com erros como segue:
Texto incomum **************
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= Em RabbitMQ.Client.Impl.SessionBase.Transmit(Command cmd) em RabbitMQ.Client.Impl.ModelBase.ModelSend(método MethodBase, cabeçalho ContentHeaderBase, corpo Byte[]) em RabbitMQ.Client.Impl.ModelBase.BasicPublish(Troca de strings, String routingKey, Boolean obrigatório, IBasicProperties basicProperties, Byte[] corpo) em RabbitMQ.Client.Impl.ModelBase.BasicPublish(Troca de strings, Chave de roteamento de strings, IBasicProperties basicProperties, corpo Byte[]) Em rabbitMQ_Publish.Form1.button1_Click(Object sender, EventArgs e) posição C:\project\my\RabbitMQ-demo\rabbitMQ-Publish\Form1.cs: linha número 37 Em System.Windows.Forms.Control.OnClick(EventArgs e) Em System.Windows.Forms.Button.OnClick(EventArgs e) Em System.Windows.Forms.Button.PerformClick() em System.Windows.Forms.Form.ProcessDialogKey(KeykeyData) em System.Windows.Forms.TextBoxBase.ProcessDialogKey(KeyKeyData) Em System.Windows.Forms.Control.PreProcessMessage(Message& msg) Em System.Windows.Forms.Control.PreProcessControlMessageMessageInternal(Control target, Message& msg) Em System.Windows.Forms.Application.ThreadContext.PreTranslateMessage(MSG& msg)
Então, como pode ser recuperado de forma anormal? Ou está desconectado e reconectado?
O código-fonte do RabbitMQ NET Client, a pesquisa encontrou umRecuperaçãoAutomáticaHabilitada = verdadeiroVeja como usá-lo
O mecanismo específico de recuperação é o seguinte
1. Quando o AutoRecoveringConnection for inicializado, adicione o gerenciamento de desconexão ao delegado de eventos de encerramento do link
Observe a chamada BeginAutomaticRecovery e você verá que o método PerformAutomaticRecovery é chamado internamente. Vamos olhar diretamente para o conteúdo desse método, sendo o primeiro o método RecoverConnectionDelegate
A chamada nesse método é:
Como você pode ver, ele executa um loop morto até a conexão reabrir e, claro, se encontrar uma exceção, chama o Thread.Sleep para esperar um pouco e então realiza a recuperação da conexão novamente.
|