作为 MassTransit 和 RabbitMQ 的新用户,我目前正在尝试使我的 ASP.NET 核心服务与 MassTransit 配合使用。
使用此文档部分来配置 MassTransit 和 ASP.NET Core 我无法使其正常工作。
目前(部分)Startup.cs 看起来像
services.AddMassTransit(x =>
{
x.AddConsumer<MailConsumer>();
x.AddConsumer<MailFailedConsumer>();
x.AddBus(provider => ConfigureBus(provider, rabbitMqConfigurations));
});
private IBusControl ConfigureBus(
IServiceProvider provider,
RabbitMqConfigSection rabbitMqConfigurations) => Bus.Factory.CreateUsingRabbitMq(
cfg =>
{
var host = cfg.Host(
rabbitMqConfigurations.Host,
"/",
hst =>
{
hst.Username(rabbitMqConfigurations.Username);
hst.Password(rabbitMqConfigurations.Password);
});
cfg.ReceiveEndpoint(host, $"{typeof(MailSent).Namespace}.{typeof(MailSent).Name}", endpoint =>
{
endpoint.Consumer<MailConsumer>(provider);
});
cfg.ReceiveEndpoint(host, $"{typeof(MailSentFailed).Namespace}.{typeof(MailSentFailed).Name}", endpoint =>
{
endpoint.Consumer<MailFailedConsumer>(provider);
});
});
交换器在启动时在 RabbitMQ 中自动创建,但没有队列绑定到我期望的交换器。
调用我的 API 端点后,我可以看到交换器上的活动,但当然消费者什么也不做,因为没有队列。
我错过了什么(明显的)部分?
好的,我发现了问题。它按照文档编写时所描述的方式工作。
AddMassTransit
接口有几个IServiceCollection
扩展,令人困惑。
AddMassTransit
过载,接受总线实例按描述工作。
AddMassTransit
重载,仅接受 Action<IServiceCollectionConfigurator>
进行必要的注册。
您需要添加一行:
services.AddMassTransitHostedService();
你的代码将会工作。
根据最新的 MT 版本,
services.AddMassTransitHostedService();
已被弃用。
这个和RabbitMQ有关。
假设您有一个程序将消息发布到队列并为其配置交换,并且您有另一个程序来使用队列中的消息。
如果您仅运行发布者程序,它将不会创建定义的队列。当您运行消费者程序时,它将检查队列是否存在,如果不存在,它将创建一个队列并与定义的交换器绑定。 确保在将任何消息发布到队列之前运行消费者程序。否则您会看到 RabbitMQ UI 显示消息已到达交换器,但不在队列中。
我正在分享我对此的想法,因为我目前一直在开发 .NET Core Web API 项目,该项目将消息发布到队列,并有另一个工作项目来使用队列中的消息。
我想这会帮助你解决你的问题。谢谢。