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