一段时间后在RabbitMQ中出现OutOfMemory问题

4
我使用C#,MassTransit和Autofac与RabbitMQ一起工作。
我有一个定时(5秒)的作业来消费队列。
这项工作大约持续了2个小时,然后突然停止。当我搜索日志时,我发现了这个错误:

范围 ---> 在创建总线期间发生异常(有关详细信息,请参见内部异常。)---> MassTransit.ConfigurationException:在创建总线期间发生异常 ---> 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);
}  

感谢您提前预先准备。

我曾经遇到过类似的问题,谢谢您的提问。 - Ahmet Tuğrul Bayrak
2个回答

2

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

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


谢谢您和@Anton的答复,我已经采纳了建议(尽管我们确实有消费者),但是这次我收到了以下错误,而且一直重复出现: 总线已经启动,忽略额外的启动尝试: rabbitmq://192.168.1.1/bus-BNN-NB-0019-PRM.ConsoleApplications.RabbitMQTest-sbgoyynx9txf dtdobdk5b9tsyi?durable=false&autodelete=true - kbylmz
显然你启动了多次总线。我在我的答案中写道,你应该在应用程序启动时启动总线,在应用程序关闭时关闭它。 - Alexey Zimarev

1
问题在于每次解析IBusControl实例时,都会创建一个新的实例。但是您没有使用生命周期范围-这个实例不会被GC收集。
我看到两种解决方案:
  1. 在生命周期范围内解析IBusControl请参见此处
  2. IBusControl注册为SingleInstance。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接