Le code d’exemple officiel NET pour les consommateurs fourni par Rabbitmq est le suivant, mais lors du processus d’utilisation, vous rencontrerez le problème de la déconnexion ; une fois déconnecté, ce code signalera une erreur, ce qui fera raccrocher les consommateurs ou les producteurs.
La photo suivante montre le producteur envoyant un message, j’ai arrêté rabbitmq manuellement, puis redémarré rabbitmq, probablement après le démarrage réussi, j’ai attendu encore 10 secondes pour empêcher le service de démarrer complètement
Une fois le service complètement lancé, j’essaie de renvoyer quelques messages avec des erreurs comme suit :
Texte inhabituel **************
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= Dans RabbitMQ.Client.Impl.SessionBase.Transmit(Command cmd) at RabbitMQ.Client.Impl.ModelBase.ModelSend(méthode MethodBase, en-tête ContentHeaderBase, corps Byte[]) sur RabbitMQ.Client.Impl.ModelBase.BasicPublish(Échange de chaînes, Clé de routage de chaînes, obligatoire booléen, IBasicProperties basicProperties, corps de byte[] sur RabbitMQ.Client.Impl.ModelBase.BasicPublish(Échange de chaînes, Clé de routage de chaînes, IBasicProperties PropertiesBasicProperties, corps Byte[]) À rabbitMQ_Publish.Form1.button1_Click(Object sender, EventArgs e) position C :\project\my\RabbitMQ-demo\rabbitMQ-Publish\Form1.cs : ligne numéro 37 Dans System.Windows.Forms.Control.OnClick(EventArgs e) Dans System.Windows.Forms.Button.OnClick(EventArgs e) Dans System.Windows.Forms.Button.PerformClick() sur System.Windows.Forms.Form.ProcessDialogKey(Keys keyData) sur System.Windows.Forms.TextBoxBase.ProcessDialogKey(Keys keyData) Dans System.Windows.Forms.Control.PreProcessMessage(Message& msg) Dans System.Windows.Forms.Control.PreProcessControlMessageInternal(Control target, Message& msg) Sur System.Windows.Forms.Application.ThreadContext.PreTranslateMessage(MSG& msg)
Alors, comment peut-on se remettre de façon anormale ? Ou est-ce que c’est déconnecté puis reconnecté ?
Le code source du client RabbitMQ NET, la recherche a trouvé unAutomaticRecoveryEnabled = vraiVoici comment l’utiliser
Le mécanisme spécifique de récupération est le suivant
1. Lorsque AutoRecoveringConnection est initialisé, ajoutez la gestion de la déconnexion au délégué d’événement de fermeture de lien
Observez l’appel BeginAutomaticRecovery, et vous verrez que la méthode PerformAutomaticRecovery est appelée en interne. Examinons directement le contenu de cette méthode, la première étant la méthode RecoverConnectionDelegate
L’appel dans cette méthode est :
Comme vous pouvez le voir, il exécute une boucle morte jusqu’à ce que la connexion se rouvre, et bien sûr, s’il rencontre une exception, il appelle Thread.Sleep pour attendre un moment puis effectue à nouveau la récupération de la connexion.
|