ASP.NET Core服务未创建RabbitMQ队列。

7

作为MassTransit和RabbitMQ的新用户,我目前正在尝试让我的ASP.NET Core服务与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端点后,我可以看到交换机上有活动,但由于没有队列,消费者当然不会执行任何操作。 我缺少哪个(显而易见的)部分?

是的,MT托管服务没有注册。你能把你的代码库放到GitHub上吗?我可以快速查看一下。 - Alexey Zimarev
1个回答

10

好的,我找到了问题所在。它按照文档描述的方式工作,当时文档编写时是正确的。 IServiceCollection 接口有几个 AddMassTransit 扩展方法,这让人感到困惑。

AddMassTransit 重载方法,接受 bus 实例的方式按照文档描述工作。

AddMassTransit 重载方法,只接受 Action<IServiceCollectionConfigurator> 参数的方式则仅做必要的注册工作。

您需要添加一行代码:

services.AddMassTransitHostedService();

你的代码将会正常工作。


谢谢!这非常有帮助 :-) 不过现在我的健康检查出现了 MassTransit bus is not ready 的错误。但是队列和交换机已经创建了! - Andrew
2
通过添加 cfg.UseHealthCheck(provider); 修复了 MassTransit 总线未准备好的问题。 - Andrew
是的,我相信这在文档中有提到 :) 仍然需要澄清一下,谢谢你指出来 :) - Alexey Zimarev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接