C# 在MassTransit中,是否可以对批处理消费者使用作用域筛选器?
我尝试对批处理使用者使用作用域筛选器,但在启动时遇到异常。我单独测试了批量消费者和过滤器,它们工作正常 主要方法:C# 在MassTransit中,是否可以对批处理消费者使用作用域筛选器?,c#,.net-core,masstransit,C#,.net Core,Masstransit,我尝试对批处理使用者使用作用域筛选器,但在启动时遇到异常。我单独测试了批量消费者和过滤器,它们工作正常 主要方法: static async Task Main(string[] args) { var host = new HostBuilder() .UseServiceProviderFactory(new AutofacServiceProviderFactory()) .ConfigureContainer<ContainerBuilder
static async Task Main(string[] args)
{
var host = new HostBuilder()
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureContainer<ContainerBuilder>((hostBuilderContext, builder) =>
{
// scoped filter
builder.RegisterGeneric(typeof(MyFilter<>)).InstancePerLifetimeScope();
builder.AddMassTransit(configurator =>
{
configurator.UsingRabbitMq((context, cfg) =>
{
cfg.Durable = true;
cfg.Host(new Uri("rabbitmq://localhost"), h =>
{
h.Username("guest");
h.Password("guest");
});
cfg.UseConsumeFilter(typeof(MyFilter<>), context);
cfg.ReceiveEndpoint("hello-queue", endpointConfigurator =>
{
endpointConfigurator.Batch<SayHello>(b =>
{
b.MessageLimit = 100;
b.ConcurrencyLimit = 10;
b.TimeLimit = TimeSpan.FromSeconds(1);
b.Consumer(() => new BatchConsumer());
});
});
});
});
})
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<HostedService>();
});
await host.Build().RunAsync();
}
static async Task Main(字符串[]args)
{
var host=new HostBuilder()
.UseServiceProviderFactory(新的AutofacServiceProviderFactory())
.ConfigureContainer((hostBuilderContext,builder)=>
{
//作用域过滤器
builder.RegisterGeneric(typeof(MyFilter)).InstancePerLifetimeScope();
builder.AddMassTransit(配置器=>
{
configurator.UsingRabbitMq((上下文,cfg)=>
{
cfg.持久=真;
主机(新Uri(“rabbitmq://localhost,h=>
{
h、 用户名(“客人”);
h、 密码(“客人”);
});
UseConsumeFilter(typeof(MyFilter),context);
ReceiveEndpoint(“hello queue”,endpointConfigurator=>
{
endpointConfigurator.Batch(b=>
{
b、 MessageLimit=100;
b、 并发极限=10;
b、 TimeLimit=从秒开始的时间跨度(1);
b、 消费者(()=>newbatchconsumer());
});
});
});
});
})
.ConfigureServices((主机上下文,服务)=>
{
services.AddHostedService();
});
等待host.Build().RunAsync();
}
例外情况:
Autofac.Core.DependencyResolutionException:“激活λ:Microsoft.Extensions.Hosting.IHostedService[]->CommandProcessor.HostedService->λ:MassTransit.IBusControl->λ:MassTransit.Registration.IBusInstance时引发异常。”
堆栈跟踪:
at Autofac.Core.Resolving.InstanceLookup.CreateInstance(IEnumerable`1 parameters)
at Autofac.Core.Resolving.InstanceLookup.Execute()
at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, ResolveRequest request)
at Autofac.Core.Resolving.ResolveOperation.ResolveComponent(ResolveRequest request)
at Autofac.Core.Resolving.ResolveOperation.Execute(ResolveRequest request)
at Autofac.Core.Lifetime.LifetimeScope.ResolveComponent(ResolveRequest request)
at Autofac.ResolutionExtensions.TryResolveService(IComponentContext context, Service service, IEnumerable`1 parameters, Object& instance)
at Autofac.ResolutionExtensions.ResolveOptionalService(IComponentContext context, Service service, IEnumerable`1 parameters)
at Autofac.ResolutionExtensions.ResolveOptional(IComponentContext context, Type serviceType, IEnumerable`1 parameters)
at Autofac.ResolutionExtensions.ResolveOptional(IComponentContext context, Type serviceType)
at Autofac.Extensions.DependencyInjection.AutofacServiceProvider.GetService(Type serviceType)
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetService[T](IServiceProvider provider)
at Microsoft.Extensions.Hosting.Internal.Host.<StartAsync>d__9.MoveNext()
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.<RunAsync>d__4.MoveNext()
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.<RunAsync>d__4.MoveNext()
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
at CommandProcessor.Program.<Main>d__0.MoveNext()
Autofac.Core.Resolving.InstanceLookup.CreateInstance上的(IEnumerable`1参数)
在Autofac.Core.Resolving.InstanceLookup.Execute()处
在Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope,ResolveRequest)上
在Autofac.Core.Resolving.ResolveOperation.ResolveComponent(ResolveRequest请求)处
在Autofac.Core.Resolving.ResolveOperation.Execute(ResolveRequest请求)处
在Autofac.Core.Lifetime.LifetimeScope.ResolveComponent处(ResolveRequest请求)
位于Autofac.ResolutionExtensions.TryResolveService(IComponentContext上下文、服务服务、IEnumerable`1参数、对象和实例)
在Autofac.ResolutionExtensions.ResolveOptionalService(IComponentContext上下文、服务服务、IEnumerable`1参数)处
在Autofac.ResolutionExtensions.ResolveOptional处(IComponentContext上下文,类型serviceType,IEnumerable`1参数)
在Autofac.ResolutionExtensions.ResolveOptional处(IComponentContext上下文,类型serviceType)
在Autofac.Extensions.DependencyInjection.AutofacServiceProvider.GetService(类型serviceType)
位于Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetService[T](IServiceProvider提供程序)
在Microsoft.Extensions.Hosting.Internal.Host.d_u9.MoveNext()中
在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()中
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)
在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中
在System.Runtime.CompilerServices.TaskAwaiter.GetResult()中
在Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.d_u4.MoveNext()中
在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()中
在Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.d_u4.MoveNext()中
在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()中
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)
在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中
在System.Runtime.CompilerServices.TaskAwaiter.GetResult()中
在CommandProcessor.Program.d_u0.MoveNext()中
我清理了您的代码,以使用正确的批处理配置,从容器解析使用者,并正确配置接收端点
static async Task Main(string[] args)
{
var host = new HostBuilder()
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureContainer<ContainerBuilder>((hostBuilderContext, builder) =>
{
// scoped filter
builder.RegisterGeneric(typeof(MyFilter<>)).InstancePerLifetimeScope();
builder.AddMassTransit(configurator =>
{
configurator.AddConsumer<BatchConsumer, BatchConsumerDefinition>();
configurator.UsingRabbitMq((context, cfg) =>
{
cfg.Host(new Uri("rabbitmq://localhost"), h =>
{
h.Username("guest");
h.Password("guest");
});
cfg.ReceiveEndpoint("hello-queue", endpointConfigurator =>
{
endpointConfigurator.UseConsumeFilter(typeof(MyFilter<>), context);
endpointConfigurator.ConfigureConsumer<BatchConsumer>(context);
});
});
});
})
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<HostedService>();
});
await host.Build().RunAsync();
}
class BatchConsumerDefinition :
ConsumerDefinition<BatchConsumer>
{
protected override void ConfigureConsumer(IReceiveEndpointConfigurator endpointConfigurator,
IConsumerConfigurator<BatchConsumer> consumerConfigurator)
{
consumerConfigurator.Options<BatchOptions>(options => options
.SetMessageLimit(100)
.SetTimeLimit(1000)
.SetConcurrencyLimit(10));
}
}
static async Task Main(字符串[]args)
{
var host=new HostBuilder()
.UseServiceProviderFactory(新的AutofacServiceProviderFactory())
.ConfigureContainer((hostBuilderContext,builder)=>
{
//作用域过滤器
builder.RegisterGeneric(typeof(MyFilter)).InstancePerLifetimeScope();
builder.AddMassTransit(配置器=>
{
configurator.AddConsumer();
configurator.UsingRabbitMq((上下文,cfg)=>
{
主机(新Uri(“rabbitmq://localhost,h=>
{
h、 用户名(“客人”);
h、 密码(“客人”);
});
ReceiveEndpoint(“hello queue”,endpointConfigurator=>
{
endpointConfigurator.UseConsumeFilter(typeof(MyFilter),上下文);
endpointConfigurator.ConfigureConsumer(上下文);
});
});
});
})
.ConfigureServices((主机上下文,服务)=>
{
services.AddHostedService();
});
等待host.Build().RunAsync();
}
类BatchConsumerDefinition:
消费者定义
{
受保护的覆盖无效配置使用者(IReceiveEndpointConfigurator endpointConfigurator,