我正在C#中使用RabbitMQ进行实验,而我的C#消费者项目使用了过多的内存却遇到了问题。
我有两个C#应用程序。首先是将消息发布到队列。另一种是使用来自同一队列的消息。
发布c#程序正常。它可以实现预期的效果。
然而,消费者应用程序从队列中消耗了foreach消息,它使用了更多的内存,而且似乎没有被垃圾回收。
我从队列中使用的Foreach消息,我使用newtonsofts json库反序列化它并将其放入对象中。然后,我对该对象进行评估,并继续进行队列中的下一条消息。
我的对象
public class MyObject : IDisposable
{
public int Id { get; set; }
public string Name { get; set; }
public void Dispose()
{
GC.SuppressFinalize(this);
}
~OrderDoneMessage()
{
Dispose();
}
}
这是我设置消费者的方式:
public void RabbitMQListener(object obj)
{
var token = (CancellationToken)obj;
var factory = new ConnectionFactory { HostName = Hostname };
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
SetupEventHandler(channel, $"MyObjExchange_{nameof(MyObject).ToLower()}", MyObject);
while (!token.IsCancellationRequested)
{
Thread.Sleep(100);
}
}
}
private void SetupEventHandler(IModel channel, string queueName, EventHandler<BasicDeliverEventArgs> handler)
{
// Create queues if they do not exist
var exchangeName = $"MyObjExchange_{nameof(MyObject).ToLower()}";
channel.ExchangeDeclare(exchangeName, ExchangeType.Fanout);
channel.QueueDeclare(queueName, false, false, false, null);
channel.QueueBind(queueName, exchangeName, string.Empty, null);
var consumer = new EventingBasicConsumer(channel);
consumer.Received += handler;
channel.BasicConsume(queueName, true, consumer);
}
private void OnMyObjectMessage(object model, BasicDeliverEventArgs ea)
{
var body = ea.Body;
var message = Encoding.UTF8.GetString(body);
var myObj = JsonConvert.DeserializeObject<MyObject>(message)
if(myObj.Id == Guid.Empty)
{
// Do stuff
}
}
当我运行该程序时,似乎OnMyObjectMessage方法中的消息永远不会被垃圾回收,因此会消耗越来越多的内存。
任何帮助您了解这一点的帮助