Как обрабатывать огромное количество строк из rabbitMQ в c # - PullRequest
0 голосов
/ 22 сентября 2018

Я экспериментирую с 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 никогда не собирают мусор и поэтому занимают все больше и больше памяти.

Любая помощь, чтобы понять это, очень приветствуется

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...