2013-02-22 709 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消息,并且如果处理程序花费太长时间处理,我不希望它减慢其他消息的速度。您可能会也可能不需要这取决于您的实施。但要小心编写处理消息的代码。如果需要一分钟时间运行,并且您在次秒钟内收到消息,则会导致内存不足,或者至少会导致严重的性能问题。

相关问题