我将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)?
问候!
答案 0 :(得分:3)
我遇到了和你一样的问题。我尝试了很多方法来关闭这些连接。
那些方法,有些是作品,有些只是部分作品。也许你可以尝试一下。
使用rabbitmqctl命令删除队列,然后使用RMQ的管理网站关闭连接。这意味着当前打开的队列将在1秒(1000毫秒)后过期。这样就可以删除所有队列。然后你可以关闭连接。
命令:
rabbitmqctl set_policy expiry“。*”'{“expires”:1000}' - apply-to queues
队列生存时间政策 - > https://www.rabbitmq.com/ttl.html
此方法部分有效。
搜索后,得出理由可能是:
你的制作人等待返回ACK,它不会被销毁,直到你发送ACK来确认作业已经完成。
突然之道。作品。 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停止它时,我遇到了同样的问题。在进程关闭之后,连接仍然存在,并且在管理面板中可见。
答案 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());
}
}