Клиент RabbitMQ не получает сообщения, отправленные с Api с ядром .net - PullRequest
0 голосов
/ 04 сентября 2018

Я использую .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();
    }
}

Мой потребитель.

Почему потребитель не может получить сообщение?

1 Ответ

0 голосов
/ 04 сентября 2018

Вы не ожидаете асинхронного вызова при публикации, поэтому ничего не работает.

Вам нужно изменить свой контроллер на:

[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);
}

Обратите внимание, что команды обычно отправляются, а не публикуются.

Я также надеюсь, что для службы, в которой размещаются ваши потребители, настроена конечная точка , поскольку вы не передали код запуска для этой службы.

...