El código de ejemplo oficial de NET para consumidores proporcionado por Rabbitmq es el siguiente, pero durante el proceso de uso encontrarás el problema de desconexión de conexión; una vez desconectado, este código informará de un error que hará que los consumidores o productores cuelguen.
La siguiente imagen muestra al productor enviando un mensaje, detuve rabbitmq manualmente y luego reinicié rabbitmq, probablemente después de que el inicio funcionara, esperé otros 10 segundos para evitar que el servicio comenzara completamente
Después de que el servicio está completamente iniciado, intento reenviar algunos mensajes con los siguientes errores:
Texto inusual **************
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= En RabbitMQ.Client.Impl.SessionBase.Transmit(Command cmd) en RabbitMQ.Client.Impl.ModelBase.ModelSend(método MethodBase, cabecera ContentHeaderBase, cuerpo de byte[]) en RabbitMQ.Client.Impl.ModelBase.BasicPublish(Intercambio de cadenas, Clave de enrutamiento de cadenas, obligatorio booleano, IBasicProperties basicProperties, cuerpo de byte[]) en RabbitMQ.Client.Impl.ModelBase.BasicPublish(Intercambio de cadenas, Clave de enrutamiento de cadenas, IBasicProperties básicos, cuerpo de byte[]) En rabbitMQ_Publish.Form1.button1_Click(Object sender, EventArgs e) posición C:\project\my\RabbitMQ-demo\rabbitMQ-Publish\Form1.cs: línea número 37 En System.Windows.Forms.Control.OnClick(EventArgs e) En System.Windows.Forms.Button.OnClick(EventArgs e) En System.Windows.Forms.Button.PerformClick() at System.Windows.Forms.Form.ProcessDialogKey(Keys keyData) en System.Windows.Forms.TextBoxBase.ProcessDialogKey(Keys keyData) En System.Windows.Forms.Control.PreProcessMessage(Message& msg) En System.Windows.Forms.Control.PreProcessControlMessageInternal(Control target, Message& msg) En System.Windows.Forms.Application.ThreadContext.PreTranslateMessage(MSG& msg)
¿Cómo puede recuperarse de forma anormal? ¿O está desconectado y reconectado?
El código fuente del cliente RabbitMQ NET, según la investigación, encontró unoRecuperaciónAutomáticaHabilitada = verdaderoAsí es como usarlo
El mecanismo específico de recuperación es el siguiente
1. Cuando se inicialice AutoRecoveringConnection, añade la gestión de desconexión al delegado de eventos de cierre de enlace
Observa la llamada BeginAutomaticRecovery y verás que el método PerformAutomaticRecovery se llama internamente. Veamos directamente el contenido de este método, el primero de los cuales es el método RecoverConnectionDelegate
La llamada en este método es:
Como puedes ver, ejecuta un bucle muerto hasta que la conexión se reabre y, por supuesto, si encuentra una excepción, llama a Thread.Sleep para esperar un rato y luego vuelve a hacer la recuperación de conexión.
|