Получение OutOfMemory в RabbitMQ через некоторое время - PullRequest
0 голосов
/ 03 мая 2018

Я использую RabbitMQ с C #, MassTransit, Autofac.

У меня запланированное (5 секунд) задание для использования очередей.

Эта работа работает около 2 часов, а затем внезапно останавливается. Когда я искал журналы, я нашел это:

Scope ---> Исключительная ситуация при создании шины (см. Внутренний исключение для детей.) ---> MassTransit.ConfigurationException: An исключение произошло при создании шины ---> System.OutOfMemoryException: было сгенерировано исключение типа «System.OutOfMemoryException».

Это мой блок кода для настройки Autofac в MassTransit:

builder.Register(context =>
{
    var busControl = Bus.Factory.CreateUsingRabbitMq(cfg =>
    {
        cfg.Host(new Uri(Globals.QueueUrl), h =>
        {
            h.Username(Globals.QueueUserName);
            h.Password(Globals.QueuePassword);
        });

        cfg.ReceiveEndpoint("create_sales_queue",
            ec =>
            {
                ec.Consumer<CreateSalesConsumer>(context);
                ec.UseRetry(p => p.Incremental(10, TimeSpan.FromMilliseconds(200), TimeSpan.FromMilliseconds(200)));
            });

    });
    return busControl;
})
    .InstancePerDependency()
    .As<IBusControl>()
    .Named<IBusControl>(GenericIntegrationTask.CreateSalesTask.ToString());

Это код запланированного задания:

try
{

    var bus = container.ResolveNamed<IBusControl>(GenericIntegrationTask.CreateSalesTask.ToString());
    bus.Start();
    Thread.Sleep(2000);
    bus.Stop();        
}
catch (Exception e)
{
    Console.WriteLine(e);
}  

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Вы должны никогда зарегистрировать IBus для зависимости или для запроса. Это должен быть одним экземпляром.

Вам также нужно запустить шину при запуске вашего приложения и остановить шину, когда ваше приложение остановится.

0 голосов
/ 03 мая 2018

Проблема в том, что каждый раз, когда вы решаете IBusControl экземпляр - вы создаете новый. Но вы не используете срок действия - этот экземпляр не собирается GC.

Я вижу два решения:

  1. Элемент списка Разрешить IBusControl в пределах срока действия. Смотри здесь
  2. Регистрация IBusControl в качестве единственного экземпляра
...