RabbitMQ Consumer不接收带有.net核心的Api发送的消息

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

我使用.net core 2.1.0和Masstransit和Rabbitmq。

我的问题是当从控制器发送消息时,消费者无法接收消息

public static void ConfigureServices(IServiceCollection services, IConfiguration configuration)
    {
        var bus = Bus.Factory.CreateUsingRabbitMq(sbc =>
        {
            var host = sbc.Host(new Uri("rabbitmq://localhost/"), h =>
            {
                h.Username("guest");
                h.Password("guest");
            });
        });

        services.AddSingleton<IPublishEndpoint>(bus);
        services.AddSingleton<ISendEndpointProvider>(bus);
        services.AddSingleton<IBusControl>(bus);
        services.AddSingleton<IBus>(bus);

        bus.Start();
    }

让Rabbitmq主持人。

[Route("api/[controller]")]
[ApiController]
public class BookController : ControllerBase
{
    private readonly IBus _bus;

    public BookController(IBus bus)
    {
        _bus = bus;
    }

    public void Post(CreateBookCommand createBookCommand)
    {
        _bus.Publish<CreateBookCommand>(createBookCommand);
    }
}

我的控制器。

public class BookCommandHandler : IConsumer<CreateBookCommand>
{
    private readonly IBookDomainService _bookService;
    public BookCommandHandler(IBookDomainService bookService)
    {
         _bookService = bookService;
    }

    public Task Consume(ConsumeContext<CreateBookCommand> context)
    {
         throw new NotImplementedException();
    }

    public void CreateBook(CreateBookCommand createBookCommand)
    {
         throw new NotImplementedException();
    }
}

我的消费者。

为什么消费者无法接收消息?

asp.net-core rabbitmq messaging masstransit
1个回答
1
投票

您在发布时没有等待异步调用,因此没有任何作用。

您需要将控制器更改为:

[Route("api/[controller]")]
[ApiController]
public class BookController : ControllerBase
{
    private readonly IBus _bus;

    public BookController(IBus bus)
    {
        _bus = bus;
    }

    public Task Post(CreateBookCommand createBookCommand)
        =>  _bus.Publish<CreateBookCommand>(createBookCommand);
}

这适用于单线程。如果您将有更多代码,则需要明确等待:

public async Task Post(CreateBookCommand createBookCommand)
{
    // code

    await _bus.Publish<CreateBookCommand>(createBookCommand);
}

请注意,这些命令通常是发送的,而不是发布的。

我还希望托管您的消费者的服务具有endpoint configured,因为您尚未共享该服务的启动代码。

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