将消费者连接到预配置的接收端点

Connect consumers to pre-configured receive endpoint

我正在使用 ASPNET Core 并且严重依赖依赖注入。

我希望我的事件消费者将消息中的数据存储到数据库(数据库是一项服务),但是当我通过以下方式配置消费者时,服务尚未解决:

    services.AddMassTransit(x =>
    {
        x.UsingRabbitMq((context, configuration) =>
        {
            configuration.Host("rabbitmq", "/", h =>
            {
                h.Username("root");
                h.Password("root");
            });

            configuration.ReceiveEndpoint("event-bus", e =>
            {
                e.Consumer(() => new UserCreatedConsumer(<service here>)))
            });
        });
    });

    services.AddMassTransitHostedService();

现在,我尝试的是在构建服务提供者和容器后添加消费者,使用以下代码:

    var busControl = provider.GetService<IBusControl>();

    busControl.ConnectConsumer(() => new UserCreatedConsumer(
        provider.GetService<NoticeboardMasterStore>()
    ));

    busControl.ConnectConsumer(() => new TokenCreatedConsumer(
        provider.GetService<NoticeboardMasterStore>()
    ));

遗憾的是,这没有用 - 它只是添加了一个奇怪的队列,称为 a0062491f73f_VehiclooNoticeboardService_bus_yyboyyfcnebrfjsdbdcj8cmrbz,并且消息甚至不会触发消费者。

首先,如果您有一个具有依赖关系的消费者并且正在使用容器,我建议您遵循 the documentation – 特别是在底部,它显示了如何在容器的接收端点上配置消费者。

在你的情况下,这看起来像:

services.AddMassTransit(x =>
{
    x.AddConsumer<UserCreatedConsumer>();

    x.UsingRabbitMq((context, configuration) =>
    {
        configuration.Host("rabbitmq", "/", h =>
        {
            h.Username("root");
            h.Password("root");
        });

        configuration.ReceiveEndpoint("event-bus", e =>
        {
            e.ConfigureConsumer<UserCreatedConsumer>(context);
        });
    });
});

services.AddMassTransitHostedService();

您的任何消费者依赖项也应在容器中注册(它们可以是作用域的、瞬态的或单例的——为传递给消费者实例的每条消息创建一个新的作用域)。