我有我的发送者课程。
public class RabbitSender
{
private ConnectionFactory _factory;
private IConnection _connection;
private IModel _channel;
public RabbitSender()
{
_factory = new ConnectionFactory() { HostName = "localhost" };
_connection = _factory.CreateConnection();
_channel = _connection.CreateModel();
_channel.QueueDeclare(queue: "hello",
durable: false,
exclusive: false,
autoDelete: false,
arguments: null);
}
public void Send(SendModel print)
{
byte[] messageBody = print.ToByteArray();
_channel.BasicPublish(exchange: "",
routingKey: "hello",
basicProperties: null,
body: messageBody);
}
public void Send2(SendModel print)
{
var factory = new ConnectionFactory() { HostName = "localhost" };
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
channel.QueueDeclare(queue: "hello",
durable: false,
exclusive: false,
autoDelete: false,
arguments: null);
byte[] messageBody = print.ToByteArray();
channel.BasicPublish(exchange: "",
routingKey: "hello",
basicProperties: null,
body: messageBody);
}
}
}
根据RabbitMQ网站上的文档的方法Send2()
。如您所见,它正在使用
using
,并且我没有内存泄漏问题。但是在这种情况下,我总是在调用方法Send2()时创建新的连接。
在Send()
的情况下,我创建了一次圆锥,但是在这种情况下我没有使用using
。因为使用总是关闭我的_channel
,所以我无法发送下一个味精。我尝试在发送后调用_channel.Dispose()
,但与using
之类的结果相同。而主要的问题是,如果我不释放垃圾回收器,我的内存就会泄漏。在30分钟内,我使用了86%的内存:/。万一Send2()
我没有这个问题。创建连接后以及每次发送后如何清理垃圾而不关闭_channel,我该如何实现?
我认为可能发生了几件事,但是核心问题是,根据文档,RabbitMQ客户端的使用不正确。
连接是昂贵的,并且应该为每个应用程序实例创建一次。请保留连接对象,并在需要创建新通道时重新使用它。
通道旨在为瞬态。您无需保留通道-可以在每次操作后将其丢弃。如果您要进行大量发布,则最好在每次发布后以与保持连接相似的方式保留频道。
当与服务器的连接断开时,您将需要一些逻辑来重新连接/重新建立您的应用程序。