2012-11-08 18 views
5

C# .NET uygulamasıyla RabbitMQ.Client (çalışma zamanı sürümü v2.0.50727, sürüm 2.8.1.0) kullanıyorum. Ben Uygulama düzgün, sadece kanal ve bağlantıyı kapatır kapatırsanızRabbitMQ bağlantısı, uygulama zarif bir şekilde sonlandırılmasa bile kapat

using (IConnection connection = _factory.CreateConnection()) 
{ 
    using (IModel channel = connection.CreateModel()) 
    { 
     // code... 
    } 
} 

:

böyle bir bağlantı oluşturun. Ancak uygulama yanlış kapatılırsa (örn. PC'de yeniden başlat düğmesine basılması), bu değildir. Başvuruma başlamadan önce tüm gereksiz bağlantıların (önceki oturumlardan veya hatta diğer uygulamalardan, başka bir uygulamada başka bir yerde çalışıyorsa) kapatıldığından emin olmak isterim.

Kalp atımlarını kullanabileceğimi biliyorum, ancak uygulamamın bir şey yapmaya başlamak için çok fazla zamana ihtiyacı var (saatlerce açık bağlantı ve kullanılmadığı). Bu yüzden kalp atışlarının en iyi şey olmadığını düşünüyorum.

RMQ için tüm açık bağlantıları nasıl kapatabilirim? (Ya da, daha da iyisi, verilen IP için istisna olmak üzere tüm açılmış bağlantılar)?

Saygılar!

cevap

1

Kalp atışı gibi sesler en iyi çözümdür. Aynı sebepten dolayı RabbitMQ uygulamalarına kalp atışı ekledim (rahatsız edici kapanmalar). Mesajlar arasında uzun bir zaman boşluğu olması önemli değil, kalp atışı sadece bağlantının her iki tarafta da açık olduğunu doğrulayacaktır.

3

Sizinle aynı sorunla karşılaştım. Bu bağlantıları kapatmak için birçok yöntem denedim.

Bu yöntemler, bazı çalışmaların bazıları sadece kısmen eserlerdir. Belki deneyebilirsin.

  1. Kuyrukları silmek için rabbitmqctl komutunu kullanın ve ardından RMQ'nun yönetim web sitesini kullanarak bağlantıları kapatın. Bu, geçerli açılan kuyrukların 1 saniye sonra (1000 milisaniye) süreceği anlamına gelir. Bu şekilde tüm kuyruklar silinir. Sonra bağlantıları kapatabilirsiniz.

    Komut: "*"

    rabbitmqctl set_policy son kullanma '{ "sona": 1000}' --apply-to kuyruklar

    Kuyruk Time-To-Canlı polika ->https://www.rabbitmq.com/ttl.html

    Bu yöntem kısmen çalışır.

  2. arama yaptıktan sonra, o nedeni olabilir fikrim var:

    geri dönüşü ACK bekleyen Sizin yapımcı, bu ACK işi bittikten kabul etmek göndermek e kadar tahrip olmaz.

  3. Aniden yol. Eserleri. RMQ, DB menisalarında bağlantı bilgilerini saklar.

    Adım 1: Önce rabbitmq-server'ı durdurun ve rabbitmq parçasını 'ps aux | grep rabbitmq 'pid'i bulmak için tüm rabbitmq iş parçacığını öldür.

    RMQ DB erkek konumunu bulun (1).$> Cd/var/lib/RabbitMQ/

    Adım 2: yeniden adlandırma "delete" için dosyayı başka bir ad mensia (2). $> Mv mensia mensia-bak

    Adım 3: yeniden başlatma RabbitMQ-sunucu

    üçüncü yöntemler artık benim için çalışıyor. Tüm açık bağlantıları kapatabilir.

0

Konsolda çalışanı açtığımda ve ctrl + c ile durdurduğumda aynı sorunu yaşadım. İşlem kapatıldıktan sonra bağlantı hala var ve yönetici panelinde görünür.

  • bir çözüm RabbitMQ Yönetici panelindeki
  • bağlantıyı kapatmaktır veya işlemi bulundu ve manuel sudo öldürmek -9 pid
  • onu öldürmek veya açtığınızda bir bağlantı Heartbeat ayarlayabilirsiniz. [Dead TCP Connections]
İlgili konular