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

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之外,所有已打开的连接都关闭)?
谢谢!
3个回答

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

    步骤1:首先停止rabbitmq-server,并通过'ps aux | grep rabbitmq'杀死rabbitmq线程以找到其pid,然后杀死所有rabbitmq线程。

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

    步骤2:将mensia文件重命名为另一个名称以“delete” (2). $> mv mensia mensia-bak

    步骤3:重新启动rabbitmq-server

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


1
听起来Heartbeats是您的最佳解决方案。我为了同样的原因(不优雅的关闭)将心跳添加到我的RabbitMQ应用程序中。消息之间有很长时间间隔并不重要,心跳只会验证连接在两端仍然打开。

0

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

  • 一种解决方法是在RabbitMQ管理面板中关闭连接
  • 或者您可以找到该进程并手动杀死sudo kill -9 pid
  • 或者当您打开一个连接时设置HEARTBEAT。阅读{{link1:[Dead TCP Connections]}}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接