2012-11-08 71 views
5

我在C#.NET應用程序中使用RabbitMQ.Client(運行時版本v2.0.50727,版本2.8.1.0)。即使應用程序沒有正常結束,關閉RabbitMQ連接

我創建的連接是這樣的:

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

如果我關閉應用程序正確,它只是關閉通道和連接。但是,如果應用程序關閉不正確(例如,按下PC上的重啓按鈕),則不是。我希望確保所有不必要的連接(從以前的會話甚至其他應用程序,如果錯誤的其他應用程序實例正在其他地方運行)在我開始我的應用程序之前關閉。

我知道我可能會使用心臟跳動,但是我的應用程序可能需要很多時間才能開始做任何事情(打開連接數小時而未使用)。所以我認爲心跳不是最好的。

如何關閉所有打開的RMQ連接? (或者,更好的是,所有打開的連接,除了一個給定的IP)?

問候!

回答

1

聽起來像心跳是你最好的解決方案。我爲我的RabbitMQ應用程序添加了心跳(出於同樣的原因)(不正常關機)。消息之間的時間差距並不重要,心跳只會驗證雙方的連接是否仍處於打開狀態。

3

我遇到了和你一樣的問題。我嘗試了很多方法來關閉這些連接。

這些方法,有些是作品有的只是部分作品。也許你可以試試看。

  1. 使用rabbitmqctl命令刪除隊列,然後使用RMQ的管理網站關閉連接。這意味着當前打開的隊列將在1秒(1000毫秒)後過期。這樣所有隊列都被刪除。然後你可以關閉連接。

    命令: 「*」

    rabbitmqctl set_policy到期 '{ 「過期」:1000}' --apply到隊列

    排隊時間到現場制定政策 - >https://www.rabbitmq.com/ttl.html

    此方法部分工作。

  2. 搜索後,得到的想法,原因可能是:

    你的製作人在等待返回ACK回來,它不會,直到您發送ACK確認工作已經完成銷燬。

  3. 突然的方法。作品。 RMQ將連接信息保存在其數據庫menisa中。

    Step1:先停止rabbitmq-server,然後用'ps aux | grep rabbitmq'找到它的pid,然後殺死所有的rabbitmq線程。

    查找RMQ DB mensia位置 (1)。$> cd/var/lib/rabbitmq/

    第2步:將別名文件重命名爲「刪除」 (2)。 $> MV mensia mensia李明博

    第三步:重啓的RabbitMQ服務器

    第三方法現在對我的作品。它可以關閉所有打開的連接。

0

我有同樣的問題,當我打開工作人員在控制檯,並停止與ctrl + c。過程結束後,連接仍然存在,並且在管理面板中可見。

  • 一種解決方案是緊密聯繫在RabbitMQ的管理員控制檯
  • 或者你可以發現過程,並殺死它手動須藤殺-9 PID
  • 或當您打開一個連接設置心跳。閱讀 [Dead TCP Connections]
相關問題