Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.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# 在MassTransit中,是否可以对批处理消费者使用作用域筛选器?_C#_.net Core_Masstransit - Fatal编程技术网

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,