Я экспериментирую с RabbitMQ в C #, и у меня проблема с моим потребительским проектом C #, использующим слишком много памяти.
У меня есть два приложения на C #.Первый - это публикация сообщения в очереди.Другой использует сообщения из той же очереди.
Публикация программы c # в порядке.Он делает то, что должен ..
Однако при каждом обращении к сообщению, которое потребительское приложение потребляет из очереди, оно использует больше памяти, и не похоже, что оно получает мусор.
Сообщение Foreach, которое я получаю из очереди, я десериализирую его с помощью библиотеки libton newsonofts и помещаю в объект.Затем я оцениваю этот объект и перехожу к следующему сообщению в очереди.
Мой объект:
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 никогда не собирают мусор и поэтому занимают все больше и больше памяти.
Любая помощь, чтобы понять это, очень приветствуется