即使应用程序没有正常结束,也要关闭RabbitMQ连接

时间:2012-11-08 14:46:06

标签: c# rabbitmq

我将RabbitMQ.Client(运行时版本v2.0.50727,版本2.8.1.0)与C#.NET应用程序一起使用。

我创建了这样的连接:

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

如果我正确关闭应用程序,它只会关闭通道和连接。但是如果应用程序被错误关闭(例如在PC上按下重启按钮),则不然。我想确保在开始我的应用程序之前关闭所有不必要的连接(来自之前的会话甚至其他应用程序,如果错误的其他应用程序实例正在其他地方运行)。

我知道我可能会使用心跳,但我的应用程序可能需要很长时间才能开始做任何事情(打开连接数小时而不使用)。所以我认为心跳不是最好的事情。

如何为RMQ关闭所有已打开的连接? (或者,更好的是,所有打开的连接,除了一个给定的IP)?

问候!

4 个答案:

答案 0 :(得分:3)

我遇到了和你一样的问题。我尝试了很多方法来关闭这些连接。

那些方法,有些是作品,有些只是部分作品。也许你可以尝试一下。

  1. 使用rabbitmqctl命令删除队列,然后使用RMQ的管理网站关闭连接。这意味着当前打开的队列将在1秒(1000毫秒)后过期。这样就可以删除所有队列。然后你可以关闭连接。

    命令:

      

    rabbitmqctl set_policy expiry“。*”'{“expires”:1000}' - apply-to queues

    队列生存时间政策 - > https://www.rabbitmq.com/ttl.html

    此方法部分有效。

  2. 搜索后,得出理由可能是:

    你的制作人等待返回ACK,它不会被销毁,直到你发送ACK来确认作业已经完成。

  3. 突然之道。作品。 RMQ在其DB menisa中保存连接信息。

    Step1:首先停止rabbitmq-server,然后通过'ps aux |杀死rabbitmq线程grep rabbitmq'找到它的pid然后杀死所有rabbitmq线程。

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

    Step2:将mensia文件重命名为另一个名称以“删除” (2)。 $> mv mensia mensia-bak

    第3步:重启rabbitmq-server

    第三种方法现在适用于我。它可以关闭所有打开的连接。

答案 1 :(得分:1)

听起来Heartbeats是您最好的解决方案。我出于同样的原因(不合适的关机)将心跳添加到我的RabbitMQ应用程序中。消息之间存在很长的时间间隔并不重要,心跳只会验证双方的连接是否仍然是开放的。

答案 2 :(得分:0)

当我在控制台中打开worker而不是使用ctrl + c停止它时,我遇到了同样的问题。在进程关闭之后,连接仍然存在,并且在管理面板中可见。

  • 一种解决方案是在RabbitMQ管理面板中关闭连接
  • 或者您可以找到该过程并将其手动杀死 sudo kill -9 pid
  • 或打开连接集 HEARTBEAT 时。阅读 [Dead TCP Connections]

答案 3 :(得分:0)

使用 IHostApplicationLifetime 服务注册应用停止或停止事件的操作。假设您有一个用于 RabbitMQ 管理的包装类。这是您管理 RabbitMQ 连接关闭的方式,通过其构造函数将该服务注入到您的包装类中:

public class YourRabbitMQWrapper
{
    private readonly IConnection _connection;

    public YourRabbitMQWrapper(IHostApplicationLifetime hostApplicationLifetime)
    {
        var connectionFactory = new ConnectionFactory();
        _connection = connectionFactory.CreateConnection();
        hostApplicationLifetime.ApplicationStopped.Register(() => _connection.Close());
    }
}