C# 一段时间后从RabbitMQ的记忆中消失
我将RabbitMQ与C#、MassTransit、Autofac一起使用 我有一个预定的(5秒)作业来使用队列 这项工作大约工作2小时,然后突然停止。当我搜索日志时,我发现: 作用域-->总线创建期间发生异常(请参阅内部 详细信息的异常。)-->MassTransit.ConfigurationException: 创建总线期间发生异常---> System.OutOfMemoryException:引发了类型为“System.OutOfMemoryException”的异常 以下是我在MassTransit中配置Autofac的代码块: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
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
李>
您应该决不为每个依赖项或每个请求注册您的
IBU
。它必须是一个实例
您还需要在应用程序启动时启动总线,并在应用程序停止时停止总线。感谢您的回答和@Anton,我已经应用了建议(但我们确实有消费者),但这次我收到了以下错误,不断重复:总线已经启动,忽略其他启动尝试:rabbitmq://192.168.1.1/bus-BNN-NB-0019-PRM.ConsoleApplications.RabbitMQTest-sbgoyynx9txf dtdobdk5b9tsyi?dustable=false&autodelete=true显然您多次统计总线。我在回答中写道,你应该在应用程序启动时启动总线,在应用程序关闭时关闭总线。我也遇到过类似的问题,谢谢你的提问