Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 一段时间后从RabbitMQ的记忆中消失_C#_Out Of Memory_Autofac_Masstransit - Fatal编程技术网

C# 一段时间后从RabbitMQ的记忆中消失

C# 一段时间后从RabbitMQ的记忆中消失,c#,out-of-memory,autofac,masstransit,C#,Out Of Memory,Autofac,Masstransit,我将RabbitMQ与C#、MassTransit、Autofac一起使用 我有一个预定的(5秒)作业来使用队列 这项工作大约工作2小时,然后突然停止。当我搜索日志时,我发现: 作用域-->总线创建期间发生异常(请参阅内部 详细信息的异常。)-->MassTransit.ConfigurationException: 创建总线期间发生异常---> System.OutOfMemoryException:引发了类型为“System.OutOfMemoryException”的异常 以下是我在Mas

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

我有一个预定的(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());
builder.Register(上下文=>
{
var busControl=Bus.Factory.CreateUsingRabbitMq(cfg=>
{
主机(新Uri(Globals.QueueUrl),h=>
{
h、 用户名(Globals.QueueUserName);
h、 密码(Globals.QueuePassword);
});
接收端点(“创建销售队列”,
ec=>
{
欧共体消费者(上下文);
ec.UseRetry(p=>p.Incremental(10,TimeSpan.frommissions(200),TimeSpan.frommissions(200));
});
});
返回总线控制;
})
.InstancePerDependency()实例
.As()
.Named(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);
}  
试试看
{
var bus=container.ResolveName(GenericIntegrationTask.CreateSalesTask.ToString());
bus.Start();
《睡眠》(2000年);
公共汽车站();
}
捕获(例外e)
{
控制台写入线(e);
}  

提前感谢。

问题是每次解决
IBusControl
实例时,都会创建一个新实例。但您不使用生存期范围-此实例不是由GC收集的

我看到两种解决办法:

  • 列表项解析生存期范围内的
    IBusControl
  • 将IBusControl注册为单个实例

  • 您应该决不为每个依赖项或每个请求注册您的
    IBU
    。它必须是一个实例


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

    感谢您的回答和@Anton,我已经应用了建议(但我们确实有消费者),但这次我收到了以下错误,不断重复:总线已经启动,忽略其他启动尝试:rabbitmq://192.168.1.1/bus-BNN-NB-0019-PRM.ConsoleApplications.RabbitMQTest-sbgoyynx9txf dtdobdk5b9tsyi?dustable=false&autodelete=true显然您多次统计总线。我在回答中写道,你应该在应用程序启动时启动总线,在应用程序关闭时关闭总线。我也遇到过类似的问题,谢谢你的提问