2013-02-22 64 views
8

如果我連接到RabbitMQ並使用EventingBasicConsumer監聽事件,如何判斷我是否與服務器斷開連接?RabbitMQ客戶端如何知道它何時失去與服務器的連接?

我知道有一個關機事件,但如果我拔掉我的網線來模擬一個故障,因此不火。

我也試過ModelShutdown事件,並在模型上CallbackException但沒有似乎工作。

編輯----- 一個我標記爲答案是正確的,但它只是對我來說是解決方案的一部分。 RabbitMQ還內置HeartBeat功能。服務器在配置文件中指定它。它默認爲10分鐘,但當然你可以改變它。

客戶端也可以請求不同的間隔,用於通過對所述的ConnectionFactory實例設置RequestedHeartbeat值的心跳。

+0

您可以將心跳添加到將檢測服務中斷的連接 – robthewolf 2013-02-23 08:20:03

+0

您可以發佈整個代碼嗎?我面臨同樣的問題。提前致謝。 – Pritam 2015-01-16 10:51:42

+0

你真的需要3件東西。 1 ConnectionFactory需要設置一個RequestedHeartBeat。 2在創建連接之後定義ConnectionShutdown事件,如標記答案中所述。 3確保你已經在rabbitmq配置文件中正確設置了它。 (對不起,我目前沒有這部分內容)。我會看看我是否可以在沒有任何特定實現的情況下提取代碼。 – Kelly 2015-01-18 17:24:15

回答

5

我猜你正在使用C#庫? (但即使如此,我認爲其他人也有類似的事件)。

你可以做到以下幾點:

public class MyRabbitConsumer 
{ 
    private IConnection connection; 

    public void Connect() 
    { 
    connection = CreateAndOpenConnection(); 
    connection.ConnectionShutdown += connection_ConnectionShutdown; 
    } 

    public IConnection CreateAndOpenConnection() { ... } 

    private void connection_ConnectionShutdown(IConnection connection, ShutdownEventArgs reason) 
    { 

    } 
} 
+0

我應該在哪裏實現此代碼? – Pritam 2015-01-16 11:20:47

0

這是它的一個例子,但標明答案是什麼導致我這個。

var factory = new ConnectionFactory 
{ 
    HostName = "MY_HOST_NAME", 
    UserName = "USERNAME", 
    Password = "PASSWORD", 
    RequestedHeartbeat = 30 
}; 

using (var connection = factory.CreateConnection()) 
{ 
    connection.ConnectionShutdown += (o, e) => 
    {      
     //handle disconnect        
    }; 

    using (var model = connection.CreateModel()) 
    { 
     model.ExchangeDeclare(EXCHANGE_NAME, "topic"); 
     var queueName = model.QueueDeclare(); 

     model.QueueBind(queueName, EXCHANGE_NAME, "#"); 

     var consumer = new QueueingBasicConsumer(model); 
     model.BasicConsume(queueName, true, consumer); 

     while (!stop) 
     { 
      BasicDeliverEventArgs args;      
      consumer.Queue.Dequeue(5000, out args); 

      if (stop) return; 

      if (args == null) continue; 
      if (args.Body.Length == 0) continue; 

      Task.Factory.StartNew(() => 
      { 
       //Do work here on different thread then this one 
      }, TaskCreationOptions.PreferFairness); 
     } 
    } 
} 

需要注意的一些事項。

我正在使用#作爲主題。這抓住了一切。通常你想限制一個主題。

我設置了一個名爲「stop」的變量來確定進程何時結束。您會注意到循環會一直運行,直到該變量爲真。

如果沒有新消息,則出隊等待5秒鐘,然後離開而不獲取數據。這是爲了確保我們監聽那個停止變量,並在某個時刻實際退出。根據您的喜好更改值。

當消息進來時,我在新線程上產生處理代碼。當前線程僅用於監聽rabbitmq消息,並且如果處理程序花費太長時間處理,我不希望它減慢其他消息的速度。您可能會也可能不需要這取決於您的實施。但要小心編寫處理消息的代碼。如果需要一分鐘時間運行,並且您在次秒鐘內收到消息,則會導致內存不足,或者至少會導致嚴重的性能問題。

相關問題