RabbitMQ客户端如何判断何时与服务器失去连接?

RabbitMQ客户端如何判断何时与服务器失去连接?,rabbitmq,Rabbitmq,如果我连接到RabbitMQ并使用EventingBasicConsumer侦听事件,我如何判断是否已断开与服务器的连接 我知道有关机事件,但如果我拔掉网络电缆模拟故障,它不会触发 我还尝试了ModelShutdown事件和模型上的CallbackException,但似乎都不起作用 编辑----- 我标记为答案的答案是正确的,但这只是我解决问题的一部分。RabbitMQ中还内置了心跳功能。服务器在配置文件中指定它。它默认为10分钟,但您当然可以更改它 客户端还可以通过在ConnectionFa

如果我连接到RabbitMQ并使用EventingBasicConsumer侦听事件,我如何判断是否已断开与服务器的连接

我知道有关机事件,但如果我拔掉网络电缆模拟故障,它不会触发

我还尝试了ModelShutdown事件和模型上的CallbackException,但似乎都不起作用

编辑----- 我标记为答案的答案是正确的,但这只是我解决问题的一部分。RabbitMQ中还内置了心跳功能。服务器在配置文件中指定它。它默认为10分钟,但您当然可以更改它


客户端还可以通过在ConnectionFactory实例上设置RequestedHeartbeat值来请求不同的心跳间隔。

我猜您正在使用C库?(但即便如此,我认为其他人也有类似的事件)

您可以执行以下操作:

公共类MyRabbitConsumer
{
专用i连接;
公共void Connect()
{
connection=CreateAndOpenConnection();
connection.ConnectionShutdown+=连接\连接shutdown;
}
公共IConnection CreateAndOpenConnection(){…}
专用无效连接\u连接关闭(IConnection连接、关闭事件args原因)
{
}
}

这是一个例子,但有标记的答案正是导致我这样做的原因

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秒,然后离开而不获取数据。这是为了确保我们监听stop变量,并在某个时刻实际退出。根据您的喜好更改值


当消息传入时,我会在一个新线程上生成处理代码。当前线程仅用于侦听rabbitmq消息,如果处理程序处理时间过长,我不希望它减慢其他消息的速度。您可能需要,也可能不需要,这取决于您的实现。但是要小心编写代码来处理消息。如果需要一分钟的时间运行,并且您的消息获取时间不到一秒,那么您将耗尽内存,或者至少会出现严重的性能问题

您可以向连接中添加检测服务中断的心跳信号您可以发布整个代码吗?我也面临同样的问题。提前谢谢。你真的需要三样东西。1 ConnectionFactory需要设置RequestedHeartBeat。2创建连接后,按照标记答案中的说明定义ConnectionShutdown事件。3确保在rabbitmq配置文件中正确设置。(很抱歉,我目前没有这部分内容。)我会看看是否可以在不使用任何特定于实现的东西的情况下提取代码。我在下面发布了一个示例作为答案,希望对您有所帮助。