6

我将 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

3 回答 3

3

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

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

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

    命令:

    rabbitmqctl set_policy expiry ".*" '{"expires":1000}' --apply-to 队列

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

    这种方法部分有效。

  2. 搜索后,想到原因可能是:

    您的生产者正在等待返回 ACK,在您发送 ACK 确认作业已完成之前,它不会被销毁。

  3. 突然的方式。作品。RMQ 在其 DB menisa 中保存连接信息。

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

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

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

    Step3:重启rabbitmq-server

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

于 2013-12-19T11:26:09.173 回答
1

听起来 Heartbeats 是您最好的解决方案。出于同样的原因(不正常的关闭),我向我的 RabbitMQ 应用程序添加了心跳。消息之间的时间间隔很长并不重要,心跳只会验证双方的连接是否仍然打开。

于 2012-11-14T03:42:25.077 回答
0

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

  • 一种解决方案是在 RabbitMQ 管理面板中关闭连接
  • 或者您可以找到该进程并手动终止它sudo kill -9 pid
  • 或者当你打开一个连接集HEARTBEAT。阅读[死 TCP 连接]
于 2015-12-18T14:12:14.397 回答