【问题标题】:MassTransit automatically add consumersMassTransit 自动添加消费者
【发布时间】:2021-03-14 01:05:46
【问题描述】:

我正在使用 MassTransit 连接到我们的 RabbitMQ。目前我正在努力将代码推广到使用它的 15 个解决方案上。但是我在设置部分遇到了障碍。原来是这样的:

  services.AddMassTransit(c =>
            {
                c.AddConsumer<MoveMouldConsumer>();
                c.AddBus(provider => Bus.Factory.CreateUsingRabbitMq(cfg =>
                {
                    cfg.UseHealthCheck(provider);
                    cfg.Host(MassTransitHelper.CreateRabbitMQEndpointUri(messageQueueSettings), h =>
                    {
                        h.Username(messageQueueSettings.Username);
                        h.Password(messageQueueSettings.Password);
                    });

                    cfg.PrefetchCount = (ushort) messageQueueSettings.PrefetchCount;
                    cfg.MessageTopology.SetEntityNameFormatter(new EntityNameFormatter());
                    cfg.ExchangeType = ExchangeType.Direct;
                    
                    cfg.ReceiveEndpoint(NameFormatter.FormatQueueName<MouldMovementEvent>("serviceName"), e =>
                    {
                        e.Bind(NameFormatter.FormatExchangeName<MouldMovementEvent>()); //Bind to Exchange
                        e.UseMessageRetry(r => r.Incremental(5, 5.Seconds(), 10.Seconds()));
                        e.ExclusiveConsumer = false;
                        e.PrefetchCount = messageQueueSettings.PrefetchCount;
                        e.Consumer<MoveMouldConsumer>(provider);
                        e.UseCircuitBreaker(cb =>
                        {
                            cb.TripThreshold = 15;
                            cb.ActiveThreshold = 10;
                            cb.ResetInterval = 5.Minutes();
                        });
                    });
                }));
            });

到目前为止,我已经设法将其概括为:

services.AddMassTransit(c =>
            {
                c.AddConsumer<MoveMouldConsumer>();
                c.AddBus(provider => Bus.Factory.CreateUsingRabbitMq(cfg =>
                {
                    cfg.UseHealthCheck(provider);
                    MassTransitSetup.BasicSetup(cfg, messageQueueSettings);
                    MassTransitSetup.InitializeConsumer<MouldMovementEvent, MoveMouldConsumer>(cfg, messageQueueSettings, provider, 5, "report");
                }));
            }); 

但我缺少的部分是我喜欢能够通过从我喜欢的组件中获取来自动添加所有消费者:

var types = AppDomain.CurrentDomain.GetAssemblies()
            .SelectMany(s => s.GetTypes())
            .Where(p => typeof(IConsumer).IsAssignableFrom(p) && p.IsClass && !p.IsAbstract && p.Namespace!.Contains("MST.Hepper.")).ToList();

但我的问题是如何遍历并添加 c.AddConsumer&lt;&gt;();MassTransitSetup.InitializeConsumer&lt;,&gt;

【问题讨论】:

    标签: c# masstransit


    【解决方案1】:

    MassTransit 具有根据程序集、类型等自动配置消费者的方法。

    services.AddMassTransit(x =>
    {
        // Add a single consumer
        x.AddConsumer<SubmitOrderConsumer>(typeof(SubmitOrderConsumerDefinition));
    
        // Add a single consumer by type
        x.AddConsumer(typeof(SubmitOrderConsumer), typeof(SubmitOrderConsumerDefinition));
    
        // Add all consumers in the specified assembly
        x.AddConsumers(typeof(SubmitOrderConsumer).Assembly);
    
        // Add all consumers in the namespace containing the specified type
        x.AddConsumersFromNamespaceContaining<SubmitOrderConsumer>();
    });
    

    Related Documentation Link

    【讨论】:

    • 所以它只是回答了这个问题。据我所知,它仍然绑定到特定类型,即“SubmitOrderConsumer”,如果我有 6 个消费者怎么办。并使用“AppDomain.CurrentDomain.GetAssemblies()”获取所有消费者并使用 foreach 自动注册它们。所以在我们的 Startup.cs 中,我只需要使用自定义 AddMassTransit 就可以了!
    • 只需将一组程序集传递给AddConsumers(assemblies)
    猜你喜欢
    • 1970-01-01
    • 2022-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多