记一次程序 内存溢出

这是造成内存溢出的代码:

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)    收藏  举报

导航