为什么在基于微服务的应用程序中使用 MassTransit、RabbitMQ 代理和 .Net 不执行 consume 方法?

Why consume method does not execute using MassTransit, RabbitMQ broker and .Net in a microservice-based application?

我正在构建一个基于微服务的应用程序,其中包含两个通过 RabbitMQ 代理进行通信的微服务。每当创建、更新或删除一本书时,都会发布一个事件。从第一个微服务发布工作正常,但另一个微服务没有消耗任何东西。尽管队列已启动并且 运行,但没有任何内容进入队列。我在使用 Visual Studio 2019 的 .Net 应用程序中使用 MassTransit 和 RabbitMQ。以下是我在 Startup.cs

中的配置代码
services.AddMassTransit(x =>
        {
            x.AddConsumer<BookCreationConsumer>();
            x.AddConsumer<BookUpdatingConsumer>();
            x.AddConsumer<BookDeletionConsumer>();

            x.UsingRabbitMq((context, configurator) =>
            {
                var rabbitMQSettings = Configuration.GetSection(nameof(RabbitMQSettings)).Get<RabbitMQSettings>();
                configurator.Host(rabbitMQSettings.Host);

                 configurator.ReceiveEndpoint("BookCreation-Queue", c =>
                 {
                     c.ConfigureConsumer<BookCreationConsumer>(context);
                 });

                 configurator.ReceiveEndpoint("BookUpdating-Queue", c =>
                 {
                     c.ConfigureConsumer<BookUpdatingConsumer>(context);
                 });

                 configurator.ReceiveEndpoint("BookDeletion-Queue", c =>
                 {
                     c.ConfigureConsumer<BookDeletionConsumer>(context);
                 });
            });
        });
        
        services.AddMassTransitHostedService();

我实现了消费者 类 以继承 IConsumer MassTransit 接口。尽管如此,接收方微服务并未使用消息。消耗法根本就打不中!以下是创建事件消费者的代码:

public class BookCreationConsumer : IConsumer<BookCreationEvent>
{
    private readonly IBooksInfoRepository repository;

    public BookCreationConsumer(IBooksInfoRepository repository)
    {
        this.repository = repository;
    }

    public async Task Consume(ConsumeContext<BookCreationEvent> context)
    {
        var message = context.Message;

        var book = await repository.GetBookInfo(message.BookID);

        if (book != null)
            return;

        book = new BookInfo
        {
            id = message.BookID,
            Title = message.Title,
            Author = message.Author,
            Edition = message.Edition,
            NumberOfPages = message.NumOfPages,
            BookURL = message.BookURL 
        };

        await repository.AddBookInfo(book);
    }

消息不消费的原因是什么?

谢谢

检查接收端点队列和交换绑定。最有可能的是,消费者在不同的命名空间中声明了按摩合同。您还会看到不仅您的消费者没有被触发,而且您端点的队列也是空的。

端点队列必须绑定到端点交换,并且端点交换必须绑定到消息交换。每个消息交换都有消息合约的名称,并在那里发布。如果发布的消息合约的命名空间与消费者端消息合约的命名空间不匹配,则无法正确创建绑定。

在文档中是 fully described

这一切都可以在 RabbitMQ 管理 Web 界面中轻松查看。