我将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);
}
提前致谢。
答案 0 :(得分:2)
您应该从不为每个依赖项或每个请求注册IBus
。 必须是单个实例。
您还需要在应用启动时启动总线,并在应用停止时停止总线。
答案 1 :(得分:1)
问题在于,每次解析IBusControl
实例时,都会创建一个新实例。但是您不使用生命周期范围 - GC不会收集此实例。
我看到两个解决方案:
IBusControl
。 See here IBusControl
注册为SingleInstance