记一次程序 内存溢出
这是造成内存溢出的代码:
public void Connect()
{
try
{
Log.Information($"RabbitMQ初始化-开始");
_connection = _factory.CreateConnection();
_connection.ConnectionShutdown -= ConnectionShutdown;
_channel = _connection.CreateModel();
_queue = _channel.QueueDeclare(string.Empty, false, true, true, null);
_channel.QueueBind(_queue, exchange, _routingKey, null);
Consumer();
Log.Information($"RabbitMQ初始化-成功");
}
catch (Exception ex)
{
Log.Error(ex, $"RabbitMQ初始化-失败-5秒后重试:{ex.Message}");
Thread.Sleep(5000);
Connect();
}
}
//上诉代码,如果输入的IP,端口,用户名密码什么的都正确是没有什么问题的,程序正常启动,也不会造成内存溢出;然而有一次,我配的IP不对,则造成 了内存溢出的情况;
原因:因为IP不正确,所以会执行到catch中 ,catch又去调用自己,如果IP一直不对,那就会形成递归调用这个方法;则会导致内存溢出。
解决思路:开启一个线程单独去让他去连接,不要造成方法的递归调用!
public void Connect()
{
try
{
Log.Information($"RabbitMQ初始化-开始");
_connection = _factory.CreateConnection();
_connection.ConnectionShutdown -= ConnectionShutdown;
_channel = _connection.CreateModel();
_queue = _channel.QueueDeclare(string.Empty, false, true, true, null);
_channel.QueueBind(_queue, exchange, _routingKey, null);
Consumer();
Log.Information($"RabbitMQ初始化-成功");
}
catch (Exception ex)
{
Log.Error(ex, $"RabbitMQ初始化-失败-5秒后重试:{ex.Message}");
Thread.Sleep(5000);
if (!isConnecting)
{
isConnecting = true;
}
//Connect();
}
}
public void Starting() { Task.Run(()=> { Connect(); }); if (!isReconnectWatcher) { ReconnectWatcher();//重连观察方法 } } public void ReconnectWatcher() { isReconnectWatcher = true; Task.Run(()=> { while (true) { Thread.Sleep(2000); if (isConnecting) { Reconnection();//重连 } } }); } public void Reconnection() { if (_channel!=null) { Stop(); } //Stop(); Starting();//重新连接 }
posted on 2022-03-25 09:31 泰坦尼克号上的活龙虾 阅读(54) 评论(0) 收藏 举报