c# - 一段时间后在 RabbitMQ 中出现 OutOfMemory
问题描述
我将 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());
这些是预定作业的代码:
try
{
var bus = container.ResolveNamed<IBusControl>(GenericIntegrationTask.CreateSalesTask.ToString());
bus.Start();
Thread.Sleep(2000);
bus.Stop();
}
catch (Exception e)
{
Console.WriteLine(e);
}
提前致谢。
解决方案
您永远不应该注册您的IBus
每个依赖项或每个请求。它必须是单个实例。
您还需要在应用启动时启动总线,并在应用停止时停止总线。
推荐阅读
- java - 带有附加用户参数的 PUT 对象的 AWS S3 预签名 URL 不起作用
- angular - 图像角度 4+
- javascript - 我正在尝试从操作中填充子菜单,但似乎它总是说未定义
- php - 加载两个自定义库
- reactjs - 如何将图像从 React 应用程序发送到 api 服务器
- oracle - 如何在 Oracle Sql Developer 中选择特定的列标题
- vue.js - 带有.NET核心后端api和区域的Vue应用程序,使用webpack,Vue没有加载
- html - 如何将复选框和跨度与文本和 googleapi 符号对齐?
- azure - 如何加快对 microsoft graph 端点的调用?
- group-by - Esper 多个属性上的不同事件