一段时间后在RabbitMQ中获取OutOfMemory

时间:2018-05-03 12:23:25

标签: c# out-of-memory autofac masstransit

我将RabbitMQ与C#,MassTransit,Autofac一起使用。

我有一个预定的(5秒)作业来消耗队列。

这项工作大约2个小时然后突然停止。当我搜索日志时,我发现了这个:

  

范围--->在总线创建期间发生异常(参见内部   例外情况。)---> MassTransit.ConfigurationException:An   在总线创建期间发生异常--->   System.OutOfMemoryException:类型' System.OutOfMemoryException'的异常。被扔了。

这些是我在MassTransit中配置Autofac的代码块:

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 :(得分:2)

您应该从不为每个依赖项或每个请求注册IBus必须是单个实例。

您还需要在应用启动时启动总线,并在应用停止时停止总线。

答案 1 :(得分:1)

问题在于,每次解析IBusControl实例时,都会创建一个新实例。但是您不使用生命周期范围 - GC不会收集此实例。

我看到两个解决方案:

  1. 列表项解析生命周期范围内的IBusControlSee here
  2. IBusControl注册为SingleInstance