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

问题描述 投票:0回答:2

作为 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 端点后,我可以看到交换器上的活动,但当然消费者什么也不做,因为没有队列。

我错过了什么(明显的)部分?

c# asp.net rabbitmq masstransit
2个回答
10
投票

好的,我发现了问题。它按照文档编写时所描述的方式工作。

AddMassTransit
接口有几个
IServiceCollection
扩展,令人困惑。

AddMassTransit
过载,接受总线实例按描述工作。

AddMassTransit
重载,仅接受
Action<IServiceCollectionConfigurator>
进行必要的注册。

您需要添加一行:

services.AddMassTransitHostedService();

你的代码将会工作。


0
投票

根据最新的 MT 版本,

services.AddMassTransitHostedService();
已被弃用。

这个和RabbitMQ有关。

假设您有一个程序将消息发布到队列并为其配置交换,并且您有另一个程序来使用队列中的消息。

如果您仅运行发布者程序,它将不会创建定义的队列。当您运行消费者程序时,它将检查队列是否存在,如果不存在,它将创建一个队列并与定义的交换器绑定。 确保在将任何消息发布到队列之前运行消费者程序。否则您会看到 RabbitMQ UI 显示消息已到达交换器,但不在队列中。

我正在分享我对此的想法,因为我目前一直在开发 .NET Core Web API 项目,该项目将消息发布到队列,并有另一个工作项目来使用队列中的消息。

我想这会帮助你解决你的问题。谢谢。

© www.soinside.com 2019 - 2024. All rights reserved.