【问题标题】:Close RabbitMQ connection even if application does not end gracefully即使应用程序没有正常结束,也要关闭 RabbitMQ 连接
【发布时间】:2012-11-08 14:46:05
【问题描述】:

我将 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 除外)?

问候!

【问题讨论】:

    标签: c# rabbitmq


    【解决方案1】:

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

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

    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 菜单中。

      第一步:先停止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

      第三步:重启rabbitmq-server

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 2021-01-25
          • 2017-03-12
          • 2020-12-30
          • 2017-03-14
          • 1970-01-01
          • 2021-10-17
          • 1970-01-01
          • 2018-10-09
          • 1970-01-01
          相关资源
          最近更新 更多