Rabbitmq tarafından verilen resmi NET tüketici örnek kodu şöyledir, ancak kullanım sürecinde bağlantı kopma sorunuyla karşılaşırsınız; bağlantı kesildiğinde bu kod bir hata bildirir ve bu da tüketicilerin veya üreticilerin telefonu kapatmasına neden olur.
Aşağıdaki fotoğraf üreticinin mesaj gönderdiğini gösteriyor, ben rabbitmq'yu manuel olarak durdurdum ve sonra rabbitmq'yu yeniden başlattım, muhtemelen başlatma başarılı olduktan sonra, hizmetin tamamen başlamasını engellemek için 10 saniye daha bekledim
Hizmet tamamen başladıktan sonra, hatalı bazı mesajları şu şekilde yeniden göndermeye çalışıyorum:
Alışılmadık Metin **************
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= RabbitMQ.Client.Impl.SessionBase.Transmit(Command cmd) içinde at RabbitMQ.Client.Impl.ModelBase.ModelSend(MethodBase metodu, ContentHeaderBase başlığı, Bayt[] gövde) at RabbitMQ.Client.Impl.ModelBase.BasicPublish (String exchange, String routingKey, Boolean zorunlu, IBasicProperties basicProperties, Byte[] body) at RabbitMQ.Client.Impl.ModelBase.BasicPublish (String exchange, String routingKey, IBasicProperties basicProperties, Byte[] body) rabbitMQ_Publish.Form1.button1_Click(Nesne göndericisi, EventArgs e) konumunda C:\project\my\RabbitMQ-demo\rabbitMQ-Publish\Form1.cs: satır numarası 37 In System.Windows.Forms.Control.OnClick(EventArgs e) In System.Windows.Forms.Button.OnClick(EventArgs e) System.Windows.Forms.Button.PerformClick() içinde at System.Windows.Forms.Form.ProcessDialogKey(Keys keyData) at System.Windows.Forms.TextBoxBase.ProcessDialogKey(Keys keyData) In System.Windows.Forms.Control.PreProcessMessage(Message&msg) In System.Windows.Forms.Control.PreProcessControlMessageInternal(Control target, Message&msg) System.Windows.Forms.Application.ThreadContext.PreTranslateMessage(MSG&msg) adresinde
Peki anormal şekilde nasıl iyileşebilir? Yoksa bağlantı kesilip yeniden bağlanıyor mu?
RabbitMQ NET Client kaynak kodu, araştırma bir tane bulduAutomaticRecoveryEnabled = doğruİşte nasıl kullanılacağı
Özel iyileşme mekanizması şöyledir
1. AutoRecoveringConnection başlatıldığında, bağlantı kapatma olay delegesine bağlantı koparma işlemi ekleyin
BeginAutomaticRecovery çağrısını izleyin, PerformAutomaticRecovery yönteminin dahili çağrıldığını görebilirsiniz. Bu yöntemin içeriğine doğrudan bakalım; ilki RecoverConnectionDelegate yöntemidir
Bu yöntemdeki çağrı şudur:
Gördüğünüz gibi, bağlantı yeniden açılana kadar ölü bir döngü çalıştırıyor ve tabii ki bir istisna karşılaştığında Thread.Sleep'i çağırıp bir süre bekleyip sonra tekrar bağlantı kurtarma işlemi gerçekleştiriyor.
|