MassTransit(RabbitMq)和#x2B;Asp.NETCore2.1:同一项目中的多个使用者

MassTransit(RabbitMq)和#x2B;Asp.NETCore2.1:同一项目中的多个使用者,rabbitmq,producer-consumer,masstransit,asp.net-core-2.1,Rabbitmq,Producer Consumer,Masstransit,Asp.net Core 2.1,我有一个Asp.NET2.1项目,它充当服务主机,用于消费由其他进程/应用程序发布的消息。我已经在Startup类(Startup.cs)中设置/配置了多个使用者,如下所示(为了简洁起见,这里只给出了MassTransit部分): 消费者: namespace MasstransitDemo.Models { public class Message { public string Value { get; set; } } public cla

我有一个Asp.NET2.1项目,它充当服务主机,用于消费由其他进程/应用程序发布的消息。我已经在Startup类(Startup.cs)中设置/配置了多个使用者,如下所示(为了简洁起见,这里只给出了MassTransit部分):

消费者:

namespace MasstransitDemo.Models
{
    public class Message
    {
        public string Value { get; set; }
    }

    public class AnotherMessage
    {
        public string Value { get; set; }
    }
}
public class SendMessageConsumer : IConsumer<Message>
{
    public Task Consume(ConsumeContext<Message> context)
    {
        Console.WriteLine($"Receive message value: {context.Message.Value}");
        return Task.CompletedTask;
    }
}

public class AnotherMessageConsumer : IConsumer<AnotherMessage>
{
    public Task Consume(ConsumeContext<AnotherMessage> context)
    {
        Console.WriteLine($"Receive another message value: {context.Message.Value}");
        return Task.CompletedTask;
    }
}
公共类SendMessageConsumer:IConsumer
{
公共任务消费(消费上下文)
{
WriteLine($“接收消息值:{context.message.value}”);
返回Task.CompletedTask;
}
}
公共类AnotherMessageConsumer:IConsumer

如何设置它,使SendMessageConsumer只接收“Message”,而AnotherMessageConsumer接收“AnotherMessage”


提前感谢。

您可以明确地告诉MassTransit您的消费者,但也可以从容器中为每个端点加载所有消费者

e.LoadFrom(provider);
e.Consumer<AnotherMessageConsumer>();

这对我不起作用。您是否对这两个
e.loadfrom(provider)
都发表了评论。请分享您的代码片段以理解

services.AddSingleton(provider => Bus.Factory.CreateUsingRabbitMq(configurator =>
    {
        IRabbitMqHost rabbitMqHost=configurator.Host(_busConfiguration.RabbitMqUri, _busConfiguration.Port, _busConfiguration.Vhost,hostConfigurator =>
        {
            hostConfigurator.Username(_busConfiguration.UserName);
            hostConfigurator.Password(_busConfiguration.Password);
        });

        configurator.ReceiveEndpoint(rabbitMqHost,_busConfiguration.GeneratePayLoadQueue, e =>
        {
            e.PrefetchCount = _busConfiguration.PrefetchCount;
            //e.LoadFrom(provider);
            e.Consumer<StagingConsumerService>(provider);
            EndpointConvention.Map<StagingConsumer>(e.InputAddress);
        });

        configurator.ReceiveEndpoint(rabbitMqHost, _busConfiguration.CreateJournalQueue , e =>
        {
            e.PrefetchCount = _busConfiguration.PrefetchFinDocCount;
            //e.LoadFrom(provider);
            e.Consumer<FinDocConsumerService>();
            EndpointConvention.Map<FinDocConsumer>(e.InputAddress);
        });
    }));

    services.AddSingleton<IBus>(provider => provider.GetRequiredService<IBusControl>());
    services.AddSingleton<IHostedService, BusService>();
services.AddSingleton(provider=>Bus.Factory.CreateUsingRabbitMq(configurator=>
{
IRabbitMqHost rabbitMqHost=configurator.Host(_-busConfiguration.RabbitMqUri,_-busConfiguration.Port,_-busConfiguration.Vhost,hostConfigurator=>
{
hostConfigurator.Username(_busConfiguration.Username);
hostConfigurator.Password(_-busConfiguration.Password);
});
configurator.ReceiveEndpoint(rabbitMqHost,_-busConfiguration.GeneratePayLoadQueue,e=>
{
e、 预取计数=\u总线配置。预取计数;
//e、 从(供应商)处下载;
e、 消费者(提供者);
EndpointConvention.Map(例如输入地址);
});
ReceiveEndpoint(rabbitMqHost,_-busConfiguration.CreateJournalQueue,e=>
{
e、 PrefetchCount=\u总线配置。PrefetchFinDocCount;
//e、 从(供应商)处下载;
e、 消费者();
EndpointConvention.Map(例如输入地址);
});
}));
services.AddSingleton(provider=>provider.GetRequiredService());
services.AddSingleton();

Alexey在下面很好地回答了这个问题,但简短的回答是不要使用.LoadFrom(),使用.Consumer(container)。谢谢Chris-Alexey的建议对我有效。谢谢你指出这一点。评论后
e.LoadFrom(提供者)它按预期工作!
e.Consumer<AnotherMessageConsumer>(container);
services.AddSingleton(provider => Bus.Factory.CreateUsingRabbitMq(configurator =>
    {
        IRabbitMqHost rabbitMqHost=configurator.Host(_busConfiguration.RabbitMqUri, _busConfiguration.Port, _busConfiguration.Vhost,hostConfigurator =>
        {
            hostConfigurator.Username(_busConfiguration.UserName);
            hostConfigurator.Password(_busConfiguration.Password);
        });

        configurator.ReceiveEndpoint(rabbitMqHost,_busConfiguration.GeneratePayLoadQueue, e =>
        {
            e.PrefetchCount = _busConfiguration.PrefetchCount;
            //e.LoadFrom(provider);
            e.Consumer<StagingConsumerService>(provider);
            EndpointConvention.Map<StagingConsumer>(e.InputAddress);
        });

        configurator.ReceiveEndpoint(rabbitMqHost, _busConfiguration.CreateJournalQueue , e =>
        {
            e.PrefetchCount = _busConfiguration.PrefetchFinDocCount;
            //e.LoadFrom(provider);
            e.Consumer<FinDocConsumerService>();
            EndpointConvention.Map<FinDocConsumer>(e.InputAddress);
        });
    }));

    services.AddSingleton<IBus>(provider => provider.GetRequiredService<IBusControl>());
    services.AddSingleton<IHostedService, BusService>();