首页 > 解决方案 > 为什么在基于微服务的应用程序中不使用 MassTransit、RabbitMQ 代理和 .Net 执行消费方法?

问题描述

我正在构建一个基于微服务的应用程序,其中包含两个通过 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);
    }

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

谢谢

标签: c#.netrabbitmqmicroservicesmasstransit

解决方案


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

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

它在文档中有完整的描述。

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


推荐阅读